Tipos de dinero en FiveM: efectivo, banco y dinero sucio en ESX, QBCore y QBox

Cómo funciona el dinero en FiveM: cuentas ESX (money, bank, black_money), efectivo, banco y criptografía de QBCore, efectivo de ox_inventory como objeto, y las cadenas de razón para tus registros.

Los jugadores tienen más de un tipo de dinero: el efectivo en su bolsillo, la cuenta bancaria, y en muchos servidores un saldo de dinero sucio. Cada framework los nombra y maneja diferente, y ox_inventory añade una tercera forma. Este artículo muestra los nombres de cuentas, las funciones para añadir y remover dinero, cómo ox_inventory trata el efectivo, y por qué la cadena de razón importa.

Cuentas ESX

ESX tiene tres cuentas estándar:

Cuenta Significado
money Efectivo
bank Saldo bancario
black_money Dinero sucio, usado para trabajos ilegales

En el servidor, con el objeto del jugador:

lua
ESX = exports['es_extended']:getSharedObject()
local xPlayer = ESX.GetPlayerFromId(source)

-- read
local cash = xPlayer.getAccount('money').money
local bank = xPlayer.getAccount('bank').money
local black = xPlayer.getAccount('black_money').money

-- add / remove
xPlayer.addAccountMoney('bank', 500, 'job-payout')
xPlayer.removeAccountMoney('black_money', 200, 'drug-purchase')

xPlayer.addAccountMoney(account, amount, reason) y removeAccountMoney toman el nombre de cuenta primero. Solo para efectivo, hay atajos:

lua
xPlayer.addMoney(100, 'sold-item')
xPlayer.removeMoney(100, 'bought-item')
local cash = xPlayer.getMoney()

removeAccountMoney no comprueba el saldo por ti. Comprueba primero, o la cuenta puede volverse negativa en algunas versiones:

lua
if xPlayer.getAccount('money').money >= price then
    xPlayer.removeAccountMoney('money', price, 'shop')
end

Si el objeto del jugador es nil, ver ESX xPlayer es nil.

Dinero en QBCore

QBCore guarda su dinero en PlayerData.money, con cash, bank y crypto:

lua
local QBCore = exports['qb-core']:GetCoreObject()
local Player = QBCore.Functions.GetPlayer(source)

-- read
local cash = Player.PlayerData.money.cash
local bank = Player.PlayerData.money.bank

-- add / remove
Player.Functions.AddMoney('bank', 500, 'job-payout')
Player.Functions.RemoveMoney('cash', 50, 'shop-purchase')

Player.Functions.AddMoney(type, amount, reason) y Player.Functions.RemoveMoney(type, amount, reason) toman el tipo primero. RemoveMoney devuelve false cuando el jugador no tiene suficiente, así que usa el resultado:

lua
if Player.Functions.RemoveMoney('cash', price, 'shop-purchase') then
    Player.Functions.AddItem('burger', 1)
else
    TriggerClientEvent('QBCore:Notify', source, 'Not enough cash', 'error')
end

No hay una cuenta de dinero sucio integrada en QBCore. Los servidores que necesitan una normalmente usan un objeto (billetes marcados) o un tipo personalizado añadido a Config.Money, y la siguiente sección cubre la opción de objeto. Si QBCore es nil en tu script, ver la solución GetCoreObject.

QBox

QBox está basado en QBCore, así que las mismas llamadas Player.Functions.AddMoney y RemoveMoney funcionan en el objeto del jugador, y los tipos de dinero son los mismos. QBox también tiene exports en qbx_core, así que comprueba los exports de tu versión de qbx_core para las funciones de dinero antes de usarlas en código nuevo. La forma es la misma: un tipo, una cantidad y una razón.

ox_inventory: efectivo como objeto

Con ox_inventory, el efectivo puede ser un objeto en lugar de un número. El objeto estándar se llama money, y el dinero sucio es black_money. Ambos están en ox_inventory/data/items.lua.

lua
-- give cash as an item
exports.ox_inventory:AddItem(source, 'money', 500)

-- count it
local cash = exports.ox_inventory:Search(source, 'count', 'money')

-- take it
exports.ox_inventory:RemoveItem(source, 'money', 100)

-- dirty money
exports.ox_inventory:AddItem(source, 'black_money', 1000)

En un servidor ESX con ox_inventory, las cuentas money y black_money se muestran como objetos en el inventario, y xPlayer.addAccountMoney('money', ...) termina en esos objetos. Usa solo una forma. Si un script añade efectivo con la función ESX y otro con AddItem, prueba que los dos estén de acuerdo en tu configuración antes de desplegarlo. El banco no es un objeto y se queda como número.

Cuidado: el efectivo como objeto tiene peso y puede ser soltado, robado o almacenado en un escondite. Esto es intencional, pero cambia cómo se comportan los scripts de robo y tienda. Ver escondites en ox_inventory.

La cadena de razón

reason es el último argumento de las funciones de dinero. No cambia la cantidad. Se pasa junto con el cambio para que el framework, o un script de registro, pueda registrar por qué se movió el dinero.

lua
Player.Functions.AddMoney('cash', 250, 'taxi-job-payout')
xPlayer.addAccountMoney('bank', 250, 'taxi-job-payout')

Usa un texto corto y consistente que nombre el script y la acción. Cuando el saldo de un jugador se ve incorrecto, una búsqueda de taxi-job-payout en los registros encuentra la línea en segundos. Si también envías registros a Discord, ver registros de webhook de Discord. Para el lado del balance de la economía, ver equilibrando una economía FiveM.

Reglas para código de dinero seguro

  • Cambia dinero en el servidor solo. Nunca aceptes una cantidad enviada por el cliente.
  • Comprueba el saldo antes de remover, y usa el valor de retorno en QBCore.
  • Pasa una razón cada vez.
  • Elige una fuente de dinero por cuenta, así el efectivo no se almacena dos veces, una como número y otra como objeto.

Checklist

Síntoma Solución
Qué cuentas ESX existen money, bank, black_money
Qué tipos QBCore existen cash, bank, crypto
El balance se vuelve negativo en ESX Comprueba getAccount(name).money antes de removeAccountMoney
La remoción de QBCore falla RemoveMoney devolvió false; el jugador no tiene suficiente
Sin dinero sucio en QBCore Usa un objeto, o añade un tipo personalizado a la config
El efectivo es un objeto ox_inventory: AddItem(source, 'money', amount)
Los registros no tienen contexto Pasa una cadena de razón en cada adición y remoción

Respuestas rápidas

¿Cuáles son los tipos de dinero en ESX?

ESX tiene cuentas nombradas money (efectivo), bank y black_money. Las cambias con xPlayer.addAccountMoney, removeAccountMoney y las lees con getAccount.

¿Cuáles son los tipos de dinero en QBCore?

QBCore almacena cash, bank y crypto en PlayerData.money. Las cambias con Player.Functions.AddMoney y RemoveMoney, pasando el tipo como primer argumento.

¿Para qué sirve el argumento de razón?

Es un texto corto que QBCore y versiones recientes de ESX adjuntan al cambio de dinero, así tus registros muestran por qué pasó. Siempre pasa uno claro, como 'burger-shop'.

Scripts que evitan este problema

Pawn Shop AppUn mercado de empeños entre jugadores dentro de lb-phone.Ver script →Drug Dealer AppVenta callejera como app de lb-phone: zonas, compradores NPC, niveles y avisos a la policía.Ver script →Shop CreatorCrea una tienda en menos de un minuto — dueños, empleados, caja fuerte y atracos.Ver script →

Sigue leyendo