Progettazione del sistema di droga FiveM: raccolta, elaborazione e vendita sicura
Come progettare un sistema di droga FiveM: raccolta e elaborazione con controlli degli oggetti lato server, limiti di velocità, vendita ai PNG in modo sicuro, avvisi di polizia e bilancio dei pagamenti.
Il sintomo: i giocatori hanno migliaia di droghe in pochi minuti, vendono lo stesso elemento allo stesso PNG per sempre, o guadagnano dieci volte quello che paga un lavoro senza nessun avviso di polizia.
Un sistema di droga ha tre stadi: raccolta, elaborazione e vendita. Tutti e tre seguono la stessa regola: il client chiede, il server controlla e decide. Questo articolo mostra i controlli e le domande di equilibrio che contano.
I tre stadi
| Stadio | Cosa accade | Cosa il server deve controllare |
|---|---|---|
| Raccolta | Il giocatore raccoglie una pianta, estrae una risorsa | Posizione, cooldown, un limite di velocità |
| Elaborazione | Gli oggetti grezzi diventano un prodotto finito | Il giocatore ha gli elementi, è al punto di elaborazione |
| Vendita | Il prodotto si trasforma in soldi o denaro sporco | L'elemento, l'acquirente, il prezzo, il cooldown |
Ogni stadio consuma o crea elementi, quindi il design sicuro utilizza le funzioni del server del tuo inventario. Il lato della creazione degli elementi è in aggiunta di elementi a ox_inventory.
Controlli degli elementi lato server
Non fidarti mai di un client che dice "Ho 10 di questo". Chiedi l'inventario sul server, rimuovi gli input, quindi aggiungi gli output, in un posto:
-- 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)Rimuovi prima, aggiungi secondo, e aggiungi solo quando la rimozione ha avuto successo. Se aggiungi prima, un giocatore che spamma l'evento può mantenere l'output e non perde nulla. Controlla canCarryItem prima di aggiungere se i giocatori possono essere pieni.
Limiti di velocità
Anche un evento legittimo può essere abusato lanciandolo da un ciclo. Dai a ogni azione un ritardo minimo per giocatore, mantenuto sul server:
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
endImposta il ritardo un po' inferiore a quello che l'azione reale impiega, così i giocatori onesti non vengono mai bloccati. Ricorda di cancellare lastAction[src] su playerDropped così la tabella non cresce per sempre. La raccolta deve anche essere limitata dalla posizione: una pianta che esiste in un campo non deve essere raccoglibile da qualunque luogo.
Vendita ai PNG in modo sicuro
La vendita ai pedoni è la parte più abusata, perché il client sceglie il ped. Aggiungi l'opzione con la tua libreria di obiettivo sul client, ad esempio su tutti i ped:
-- 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,
},
})Le basi di targeting sono in aggiunta di zone ox_target. Nota che il client invia solo il nome dell'elemento. Tutto il resto viene deciso sul server:
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)Il prezzo viene dalla config del server, mai dal client. Il nome dell'elemento dovrebbe essere controllato rispetto a un elenco consentito, perché un client potrebbe inviare qualsiasi nome. Aggiungi una possibilità casuale che il PNG rifiuti o ti segnali. Se la vendita ha bisogno che il giocatore sia in una zona o solo di notte, controlla anche quel server. Il nome dell'elemento black_money dipende dalla tua configurazione; vedi tipi di soldi.
Avvisi di polizia
Il rischio è quello che rende interessanti le droghe. Avvisa la polizia su una possibilità, dal server, con la posizione dell'affare:
- Una percentuale di possibilità su ogni vendita (ad esempio una piccola possibilità che il PNG chiami la polizia).
- Una probabilità più grande quando meno affari sono stati fatti in un'area tranquilla, o quando molti affari accadono nello stesso punto.
- Un minimo richiesto di ufficiali in servizio per vendere e elaborare, contato sul server, come in impostazione di un lavoro di polizia.
Se usi un'app telefonica per affari, gli ordini e i punti di incontro dovrebbero comunque essere creati e controllati sul server.
Drug Dealer AppSpaccio di strada come app per lb-phone: zone, acquirenti NPC, livelli e allerte alla polizia.da 18,15 €Vedi lo script →
Bilancio dei pagamenti
Bilancia numeri, non sentimenti:
- Cronometra un ciclo completo (raccolta, elaborazione, vendita) e conta quanti minuti impiega.
- Calcola denaro all'ora: payout volte cicli all'ora.
- Confrontalo con l'assegno del tuo miglior lavoro legale. Le droghe possono pagare di più, a causa del rischio, ma un fattore di due o tre è sufficiente.
- Aggiungi attrito: tempo di elaborazione, peso dell'elemento, un numero limitato di vendite per PNG, un cooldown per posizione.
Quindi guarda i soldi nel tuo database dopo una settimana e regola. Il metodo è in bilanciamento della tua economia del server.
Checklist
| Sintomo | Soluzione |
|---|---|
| Elementi infiniti | Controlla la posizione, rimuovi prima gli input e limita la velocità sul server |
| Il client imposta il prezzo | Prendi i prezzi solo dalla config del server |
| Vende qualsiasi elemento come droghe | Controlla il nome dell'elemento rispetto a un elenco consentito |
| Lo stesso PNG compra per sempre | Aggiungi un cooldown per giocatore e per ped o posizione |
| Le droghe pagano troppo | Confronta denaro all'ora con un lavoro normale |
| Nessuna reazione della polizia | Avvisa su una possibilità, dal server |
Risposte rapide
Perché i giocatori ottengono droghe illimitate?
L'evento di raccolta o elaborazione viene eseguito sul server senza controllare la posizione, l'ora o i limiti, quindi un client modificato può eseguirlo in un ciclo. Aggiungi i controlli e un limite di velocità sul server.
Come lascio che i giocatori vendano droghe ai PNG?
Aggiungi un'opzione di obiettivo ai pedoni sul client, quindi lascia che il server controlli l'elemento, la distanza, un cooldown e il prezzo prima di pagare. Il client chiede solo.
Come faccio a bilanciare i pagamenti della droga?
Calcola i soldi all'ora che un giocatore può guadagnare e confrontalo con un lavoro normale. Le droghe possono pagare di più a causa del rischio, ma non così tanto che nessuno faccia nient'altro.
Script senza questo problema
Drug Dealer AppSpaccio di strada come app per lb-phone: zone, acquirenti NPC, livelli e allerte alla polizia.Vedi script →
Item Creator V2Crea oggetti utilizzabili con animazioni, props, effetti e altro — senza scrivere codice.Vedi script →
Pawn Shop AppUn banco dei pegni tra giocatori dentro lb-phone.Vedi script →