Деньги и банк
money.transfer между двумя счетами, банковский скрипт через ai-core и счета через тот скрипт счетов, который запущен.
import { money, banking, billing } from "@aicore-fivem/lib/server";Изменения одного счёта игрока (добавить, снять, прочитать баланс) это экспорты ai-core (AddMoney, RemoveMoney, GetMoney; см. Серверные экспорты ai-core). Lib добавляет то, что требует изменения более одного счёта, а также слои банка и счетов.
money
money.transfer
Переводит деньги с одного счёта на другой в одной транзакции базы данных, с записью в журнале на обеих сторонах. Используйте для всего, где деньги не должны появиться или исчезнуть на полпути: оплата другому игроку, премия от работы, сбор.
Сторона: Сервер · Ждёт: нет
money.transfer(from: MoneyRef, to: MoneyRef, amount: number, reason?: string, fee?: number): booleanLua-аналога нет: вызывайте экспорт ai-core exports['ai-core']:TransferMoney(from, to, amount, reason, fee).
Параметры
Prop
Type
Возвращает
boolean: true, если обе строки записаны. false, если сумма не является целым числом, счёт отсутствует, оба счёта совпадают или from не может заплатить amount плюс fee.
Пример
import { onClientCallback, money, nearestPlayerTo, notify } from "@aicore-fivem/lib/server";
import { fail, oneArg, readInt } from "@aicore-fivem/lib/shared";
onClientCallback("my-cash:give", { args: oneArg((v) => readInt(v, 1, 100_000)), lock: true }, (source, amount) => {
const target = nearestPlayerTo(source, 2);
if (target === null) return fail("NOBODY_NEAR");
if (!money.transfer({ source, account: "cash" }, { source: target, account: "cash" }, amount, "give:cash"))
return fail("NOT_ENOUGH_CASH");
notify(target, `You received $${amount}`, "success");
return { ok: true };
});banking
banking общается с банковским скриптом через банковский слой ai-core. Сами деньги работы всегда перемещаются через money или экспорты ai-core.
banking.open
Открывает экран банковского скрипта для игрока.
Сторона: Сервер · Ждёт: нет
banking.open(source: number): booleanlocal ok = aiLib.banking.open(source)Возвращает true, если открыт. false, если скрипт нельзя открыть извне или никакой не запущен.
onClientCallback("my-atm:open", (source) => (banking.open(source) ? { ok: true } : fail("BANK_UNAVAILABLE")));banking.societyBalance
Баланс общества работы, для отображения. В режиме счёта core ai-core это счёт работы в ai-core; в режиме own собственный счёт банковского скрипта.
Сторона: Сервер · Ждёт: нет
banking.societyBalance(job: string): number | nulllocal balance = aiLib.banking.societyBalance(job) -- number или nilВозвращает баланс или null (в Lua nil), если никакой скрипт не запущен или скрипт его не хранит.
const balance = banking.societyBalance("mechanic") ?? 0;banking.provider
Сторона: Сервер · Ждёт: нет
banking.provider(): string | nulllocal name = aiLib.banking.provider()Возвращает банковский скрипт, который использует слой, или null.
console.log(`banking through ${banking.provider() ?? "nothing"}`);billing
billing отправляет счета через тот скрипт счетов, который запущен; без него используются собственные счета ai-core (игрок платит из списка на экране, деньги перемещаются при оплате). Тексты уже переведены.
billing.send
Отправляет счёт от работы (штрафы, плата за услуги) или от игрока.
Сторона: Сервер · Ждёт: нет
billing.send(bill: BillRequest): booleanlocal ok = aiLib.billing.send(bill)BillRequest
Prop
Type
Возвращает
boolean: true, если отправлен, false, если неверный или отклонён.
Пример
import { billing, nearestPlayerTo, online } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
function fine(officer: number, amount: number) {
if (!online.onDutyIn(officer, ["police"])) return fail("NOT_ON_DUTY");
const target = nearestPlayerTo(officer, 3);
if (target === null) return fail("NOBODY_NEAR");
return billing.send({ to: target, amount, label: "Speeding", from: officer, job: "police" })
? { ok: true }
: fail("BILL_FAILED");
}billing.unpaid
Неоплаченные счета игрока.
Сторона: Сервер · Ждёт: да (Promise в TypeScript, в Lua приостанавливает поток)
billing.unpaid(source: number): Promise<UnpaidBill[] | null>local bills = aiLib.billing.unpaid(source) -- table[] или nil, вызывайте внутри потокаВозвращает UnpaidBill[] (id, label, ещё не оплаченная amount, sender) или null, если скрипт счетов не умеет их перечислять.
const bills = await billing.unpaid(source);
const owed = bills?.reduce((sum, bill) => sum + bill.amount, 0) ?? 0;billing.pay
Игрок оплачивает один из своих неоплаченных счетов.
Сторона: Сервер · Ждёт: нет
billing.pay(source: number, id: string): booleanlocal ok = aiLib.billing.pay(source, id)Prop
Type
Возвращает true, если оплачен. false, если отклонено (не хватает денег, неизвестный счёт) или скрипт счетов принимает оплату только на своём экране.
if (!billing.pay(source, billId)) return fail("PAY_FAILED");billing.provider
Сторона: Сервер · Ждёт: нет
billing.provider(): string | nulllocal name = aiLib.billing.provider()Возвращает скрипт счетов, в который уходят счета, "ai-core" для собственных счетов ai-core.
if (billing.provider() === "ai-core") console.log("using ai-core's own bills");