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:

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)

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:

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

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

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,
    },
})

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:

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)

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:

  1. Cronometra un bucle completo (recopilar, procesar, vender) y cuenta cuántos minutos tarda.
  2. Calcula dinero por hora: pagos por bucles por hora.
  3. 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.
  4. 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 →

Sigue leyendo