Diseño del sistema de drogas de FiveM: recopilar, procesar y vender con seguridad
Cómo diseñar un sistema de drogas de FiveM: recopilar y procesar con comprobaciones de artículos del lado del servidor, limitadores de velocidad, vender a NPCs de forma segura, alertas policiales y equilibrio de pagos.
El síntoma: los jugadores tienen miles de drogas en minutos, venden el mismo artículo al mismo NPC para siempre, o ganan diez veces lo que paga un trabajo sin ninguna alerta policial en absoluto.
Un sistema de drogas tiene tres etapas: recopilar, procesar y vender. Las tres siguen la misma regla: el cliente pide, el servidor comprueba y decide. Este artículo muestra las comprobaciones y las preguntas de equilibrio que importan.
Las tres etapas
| Etapa | Qué ocurre | Lo que el servidor debe comprobar |
|---|---|---|
| Recopilar | El jugador recoge una planta, extrae un recurso | Ubicación, tiempo de reutilización, un limitador de velocidad |
| Procesar | Los artículos crudos se convierten en un producto terminado | El jugador tiene los artículos, está en el lugar de procesamiento |
| Vender | El producto se convierte en dinero o dinero sucio | El artículo, el comprador, el precio, el tiempo de reutilización |
Cada etapa consume o crea artículos, por lo que el diseño seguro usa las funciones del servidor de tu inventario. El lado de la creación de artículos está en adding items to ox_inventory.
Comprobaciones de artículos del lado del servidor
Nunca confíes en un cliente que dice «Tengo 10 de esto». Pregunta el inventario en el servidor, quita las entradas, luego añade las salidas, en un 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)Quita primero, añade segundo, y solo añade cuando la eliminación tuvo éxito. Si añades primero, un jugador que spammea el evento puede mantener la salida y no perder nada. Comprueba canCarryItem antes de añadir si los jugadores pueden estar llenos.
Limitadores de velocidad
Incluso un evento legítimo puede ser abusado disparándolo desde un bucle. Dale a cada acción un retraso mínimo por jugador, mantenido en el 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
endEstablece el retraso un poco menos de lo que tarda la acción real, para que los jugadores honestos nunca sean bloqueados. Recuerda limpiar lastAction[src] en playerDropped para que la tabla no crezca para siempre. La recopilación también debe ser limitada por ubicación: una planta que existe en un campo no debe ser recogible desde cualquier lugar.
Vender a NPCs de forma segura
Vender a peatones es la parte más abusada, porque el cliente elige al ped. Añade la opción con tu biblioteca de destino en el cliente, por ejemplo en todos los 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,
},
})Los conceptos básicos de targeting están en adding ox_target zones. Observa que el cliente envía solo el nombre del artículo. Todo lo demás se decide en el 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)El precio viene de la configuración del servidor, nunca del cliente. El nombre del artículo debe ser verificado contra una lista permitida, porque un cliente podría enviar cualquier nombre. Añade una probabilidad aleatoria de que el NPC se niegue o te denuncie. Si la venta necesita que el jugador esté en una zona o solo de noche, verifica eso en el servidor también. El nombre del artículo black_money depende de tu configuración; ve money types.
Alertas policiales
El riesgo es lo que hace que las drogas sean interesantes. Alerta a la policía sobre una probabilidad, desde el servidor, con la ubicación de la negociación:
- Una probabilidad de porcentaje en cada venta (por ejemplo, una pequeña probabilidad de que el NPC llame a la policía).
- Una probabilidad más grande cuando menos negociaciones se han realizado en un área tranquila, o cuando muchas negociaciones suceden en el mismo lugar.
- Un mínimo requerido de oficiales en servicio para vender y procesar, contado en el servidor, como en setting up a police job.
Si usas una aplicación de teléfono para negociaciones, los órdenes y los puntos de encuentro aún deben ser creados y verificados en el servidor.
Drug Dealer AppVenta callejera como app de lb-phone: zonas, compradores NPC, niveles y avisos a la policía.desde 18,15 €Ver el script →
Equilibrio de pagos
Equilibra en números, no en sensación:
- Cronometra un bucle completo (recopilar, procesar, vender) y cuenta cuántos minutos tarda.
- Calcula dinero por hora: pagos por bucles por hora.
- Compáralo con el cheque de pago del mejor trabajo legal. Las drogas pueden pagar más por el riesgo, pero un factor de dos o tres es suficiente.
- Añade fricción: tiempo de procesamiento, peso del artículo, un número limitado de ventas por NPC, un tiempo de reutilización por ubicación.
Luego observa el dinero en tu base de datos después de una semana y ajusta. El método está en balancing your server economy.
Lista de verificación
| Síntoma | Solución |
|---|---|
| Artículos infinitos | Comprueba ubicación, quita entradas primero y limitador de velocidad en el servidor |
| El cliente establece el precio | Toma precios de la configuración del servidor solo |
| Vende cualquier artículo como drogas | Comprueba el nombre del artículo contra una lista permitida |
| El mismo NPC compra para siempre | Añade un tiempo de reutilización por jugador y por ped o ubicación |
| Las drogas pagan demasiado | Compara dinero por hora con un trabajo normal |
| Sin reacción policial | Alerta sobre una probabilidad, desde el servidor |
Respuestas rápidas
¿Por qué los jugadores obtienen drogas ilimitadas?
El evento de recopilación o procesamiento se ejecuta en el servidor sin comprobar ubicación, hora o límites, por lo que un cliente modificado puede dispararlo en un bucle. Añade las comprobaciones y un limitador de velocidad en el servidor.
¿Cómo permito que los jugadores vendan drogas a NPCs?
Añade una opción de destino a peatones en el cliente, luego deja que el servidor compruebe el artículo, la distancia, un tiempo de reutilización y el precio antes de pagar. El cliente solo pide.
¿Cómo equilibro los pagos de drogas?
Calcula el dinero por hora que un jugador puede ganar y compáralo con un trabajo normal. Las drogas pueden pagar más por el riesgo, pero no tanto que nadie haga nada más.
Scripts que evitan este problema
Drug Dealer AppVenta callejera como app de lb-phone: zonas, compradores NPC, niveles y avisos a la policía.Ver script →
Item Creator V2Crea items usables con animaciones, props, efectos y más — sin escribir código.Ver script →
Pawn Shop AppUn mercado de empeños entre jugadores dentro de lb-phone.Ver script →