FiveM типы денег: наличные, банк и чёрные деньги на ESX, QBCore и QBox

Как деньги работают на FiveM: ESX счёта (money, bank, black_money), QBCore наличные, банк и крипто, ox_inventory наличные как предмет, и причины строк для вашего логов.

У игроков есть больше чем один тип денег: наличные в их кармане, банковский счёт, и на многих серверах баланс грязных денег. Каждый фреймворк называет и обрабатывает их по-разному, и ox_inventory добавляет третий способ. Эта статья показывает названия счётов, функции чтобы добавлять и удалять деньги, как ox_inventory обращается с наличными, и почему строка причины важна.

ESX счёта

ESX имеет три стандартных счёта:

Счёт Значение
money Наличные
bank Банковский баланс
black_money Грязные деньги, используются для нелегальных работ

На сервере, с объектом игрока:

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) и removeAccountMoney берут имя счёта сначала. Для наличных только, есть ярлыки:

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

removeAccountMoney не проверяет баланс для вас. Проверьте сначала, или счёт может стать отрицательным на некоторых версиях:

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

Если объект игрока nil, смотрите ESX xPlayer is nil.

QBCore деньги

QBCore держит свои деньги в PlayerData.money, с cash, bank и 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) и Player.Functions.RemoveMoney(type, amount, reason) берут тип сначала. RemoveMoney возвращает false когда игрок не имеет достаточно, поэтому используйте результат:

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

Нет встроенного счёта чёрных денег в QBCore. Серверы которые его нужны обычно используют предмет (помеченные счета) или пользовательский тип добавленный в Config.Money, и следующая секция охватывает опцию предмета. Если QBCore nil в вашем скрипте, смотрите исправление GetCoreObject.

QBox

QBox основан на QBCore, поэтому те же вызовы Player.Functions.AddMoney и RemoveMoney работают на объекте игрока, и типы денег те же. QBox также имеет exports на qbx_core, поэтому проверьте exports вашей версии qbx_core для функций денег перед тем как вы их используете в новом коде. Форма та же: тип, сумма и причина.

ox_inventory: наличные как предмет

С ox_inventory, наличные могут быть предметом вместо числа. Стандартный предмет называется money, и грязные деньги это black_money. Оба находятся в 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)

На ESX сервере с ox_inventory, счёта money и black_money показаны как предметы в инвентаре, и xPlayer.addAccountMoney('money', ...) оканчивается в эти предметы. Используйте один способ только. Если один скрипт добавляет наличные с функцией ESX и другой с AddItem, протестируйте что два согласны на вашей установке перед тем как вы его отправите. Банк не является предметом и остаётся числом.

Внимание: наличные как предмет имеют вес и могут быть выброшены, украдены или хранены в stash. Это намеренно, но это меняет как грабежи и магазин скрипты ведут себя. Смотрите stashes в ox_inventory.

Строка причины

reason это последний аргумент функций денег. Он не изменяет сумму. Он передаётся вместе с изменением так что фреймворк, или скрипт логирования, может записать почему деньги переместились.

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

Используйте короткий, постоянный текст который называет скрипт и действие. Когда баланс игрока выглядит неправильным, поиск taxi-job-payout в логах находит строку в секунды. Если вы также отправляете логи в Discord, смотрите Discord webhook логи. Для стороны баланса экономики, смотрите балансировка FiveM экономики.

Правила для безопасного кода денег

  • Изменяйте деньги на сервере только. Никогда не принимайте сумму отправленную клиентом.
  • Проверьте баланс перед тем как удалить, и используйте возвращаемое значение на QBCore.
  • Передавайте причину каждый раз.
  • Выберите один источник денег на счёт, так что наличные не хранятся дважды, один раз как число и один раз как предмет.

Контрольный список

Симптом Решение
Какие ESX счёта существуют money, bank, black_money
Какие типы QBCore существуют cash, bank, crypto
Баланс становится отрицательным на ESX Проверьте getAccount(name).money перед removeAccountMoney
QBCore remove падает RemoveMoney вернул false; игрок не имеет достаточно
Нет чёрных денег на QBCore Используйте предмет, или добавьте пользовательский тип в конфиг
Наличные это предмет ox_inventory: AddItem(source, 'money', amount)
Логи не имеют контекста Передавайте строку причины на каждое добавление и удаление

Короткие ответы

Какие типы денег в ESX?

ESX имеет счёта названные money (наличные), bank и black_money. Вы их изменяете с xPlayer.addAccountMoney, removeAccountMoney и читаете их с getAccount.

Какие типы денег в QBCore?

QBCore хранит cash, bank и crypto в PlayerData.money. Вы их изменяете с Player.Functions.AddMoney и RemoveMoney, передавая тип как первый аргумент.

Зачем нужен аргумент reason?

Это короткий текст который QBCore и последние версии ESX прикрепляют к изменению денег, так что ваши логи показывают почему это произошло. Всегда передавайте ясный, такой как 'burger-shop'.

Скрипты без этой проблемы

Pawn Shop AppЛомбард между игроками прямо в lb-phone.Смотреть скрипт →Drug Dealer AppУличная торговля в виде приложения lb-phone: зоны, NPC-покупатели, уровни и вызовы полиции.Смотреть скрипт →Shop CreatorМагазин меньше чем за минуту — владельцы, сотрудники, сейфы и ограбления в комплекте.Смотреть скрипт →

Читайте также