Tipos de dinheiro em FiveM: cash, bank e black money em ESX, QBCore e QBox

Como funciona o dinheiro em FiveM: contas ESX (money, bank, black_money), cash, bank e crypto de QBCore, cash de ox_inventory como um item, e reason strings para seus logs.

Os jogadores têm mais de um tipo de dinheiro: o dinheiro no bolso, a conta bancária, e em muitos servidores um saldo de dinheiro sujo. Cada framework os nomeia e os manipula de forma diferente, e ox_inventory adiciona uma terceira maneira. Este artigo mostra os nomes das contas, as funções para adicionar e remover dinheiro, como ox_inventory trata cash, e por que a string de razão importa.

Contas ESX

ESX tem três contas padrão:

Conta Significado
money Cash
bank Saldo bancário
black_money Dinheiro sujo, usado para trabalhos ilegais

No servidor, com o objeto do jogador:

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) e removeAccountMoney pegam o nome da conta primeiro. Apenas para cash, existem atalhos:

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

removeAccountMoney não verifica o saldo para você. Verifique primeiro, ou a conta pode ficar negativa em algumas versões:

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

Se o objeto do jogador for nil, veja ESX xPlayer is nil.

Dinheiro QBCore

QBCore mantém seu dinheiro em PlayerData.money, com cash, bank e 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) e Player.Functions.RemoveMoney(type, amount, reason) pegam o tipo primeiro. RemoveMoney retorna false quando o jogador não tem o suficiente, então use o 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

Não há conta de dinheiro preto integrada no QBCore. Servidores que precisam de uma geralmente usam um item (marked bills) ou um tipo customizado adicionado a Config.Money, e a próxima seção cobre a opção de item. Se QBCore for nil em seu script, veja the GetCoreObject fix.

QBox

QBox é baseado em QBCore, então as mesmas chamadas Player.Functions.AddMoney e RemoveMoney funcionam no objeto do jogador, e os tipos de dinheiro são os mesmos. QBox também tem exports em qbx_core, então verifique os exports de sua versão qbx_core para as funções de dinheiro antes de usá-las em novo código. A forma é a mesma: um tipo, um valor e uma razão.

ox_inventory: cash como um item

Com ox_inventory, o cash pode ser um item em vez de um número. O item padrão é chamado money, e dinheiro sujo é black_money. Ambos estão em 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)

Em um servidor ESX com ox_inventory, as contas money e black_money são mostradas como itens no inventário, e xPlayer.addAccountMoney('money', ...) acaba nesses itens. Use apenas uma maneira. Se um script adiciona cash com a função ESX e outro com AddItem, teste se os dois concordam em sua configuração antes de lançar. O banco não é um item e permanece um número.

Atenção: cash como um item tem peso e pode ser derrubado, roubado ou armazenado em um estoque. Isso é intencional, mas muda como scripts de roubo e loja se comportam. Veja stashes in ox_inventory.

A string de razão

reason é o último argumento das funções de dinheiro. Não muda o valor. É passado juntamente com a mudança para que o framework, ou um script de logging, possa registrar por que o dinheiro se moveu.

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

Use um texto curto e consistente que nomeie o script e a ação. Quando o saldo de um jogador parece errado, uma pesquisa por taxi-job-payout nos logs encontra a linha em segundos. Se você também enviar logs para Discord, veja Discord webhook logs. Para o lado do saldo da economia, veja balancing a FiveM economy.

Regras para código seguro de dinheiro

  • Mude o dinheiro apenas no servidor. Nunca aceite um valor enviado pelo cliente.
  • Verifique o saldo antes de remover, e use o valor de retorno em QBCore.
  • Passe uma razão toda vez.
  • Escolha uma fonte de dinheiro por conta, para que o cash não seja armazenado duas vezes, uma como número e outra como item.

Lista de verificação

Sintoma Solução
Quais contas ESX existem money, bank, black_money
Quais tipos QBCore existem cash, bank, crypto
Saldo fica negativo em ESX Verifique getAccount(name).money antes de removeAccountMoney
Remoção de QBCore falha RemoveMoney retornou false; o jogador não tem o suficiente
Sem dinheiro preto em QBCore Use um item, ou adicione um tipo customizado à configuração
Cash é um item ox_inventory: AddItem(source, 'money', amount)
Logs não têm contexto Passe uma string de razão em cada adição e remoção

Respostas rápidas

Quais são os tipos de dinheiro em ESX?

ESX tem contas chamadas money (cash), bank e black_money. Você as muda com xPlayer.addAccountMoney, removeAccountMoney e lê com getAccount.

Quais são os tipos de dinheiro em QBCore?

QBCore armazena cash, bank e crypto em PlayerData.money. Você os muda com Player.Functions.AddMoney e RemoveMoney, passando o tipo como primeiro argumento.

Para que serve o argumento reason?

É um texto curto que QBCore e versões recentes de ESX anexam à mudança de dinheiro, para que seus logs mostrem por que aconteceu. Sempre passe uma clara, como 'burger-shop'.

Scripts sem esse problema

Pawn Shop AppUma casa de penhores entre jogadores dentro do lb-phone.Ver script →Drug Dealer AppVendas na rua como app do lb-phone: zonas, compradores NPC, níveis e alertas para a polícia.Ver script →Shop CreatorMonte uma loja em menos de um minuto — donos, funcionários, cofres e assaltos inclusos.Ver script →

Continue lendo