AI Core
Справочник APILib: сервер

Деньги и банк

money.transfer между двумя счетами, банковский скрипт через ai-core и счета через тот скрипт счетов, который запущен.

TypeScript
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): boolean

Lua-аналога нет: вызывайте экспорт 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): boolean
Lua
local 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 | null
Lua
local balance = aiLib.banking.societyBalance(job) -- number или nil

Возвращает баланс или null (в Lua nil), если никакой скрипт не запущен или скрипт его не хранит.

const balance = banking.societyBalance("mechanic") ?? 0;

banking.provider

Сторона: Сервер · Ждёт: нет

Сигнатура
banking.provider(): string | null
Lua
local name = aiLib.banking.provider()

Возвращает банковский скрипт, который использует слой, или null.

console.log(`banking through ${banking.provider() ?? "nothing"}`);

billing

billing отправляет счета через тот скрипт счетов, который запущен; без него используются собственные счета ai-core (игрок платит из списка на экране, деньги перемещаются при оплате). Тексты уже переведены.

billing.send

Отправляет счёт от работы (штрафы, плата за услуги) или от игрока.

Сторона: Сервер · Ждёт: нет

Сигнатура
billing.send(bill: BillRequest): boolean
Lua
local 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>
Lua
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): boolean
Lua
local ok = aiLib.billing.pay(source, id)

Prop

Type

Возвращает true, если оплачен. false, если отклонено (не хватает денег, неизвестный счёт) или скрипт счетов принимает оплату только на своём экране.

if (!billing.pay(source, billId)) return fail("PAY_FAILED");

billing.provider

Сторона: Сервер · Ждёт: нет

Сигнатура
billing.provider(): string | null
Lua
local name = aiLib.billing.provider()

Возвращает скрипт счетов, в который уходят счета, "ai-core" для собственных счетов ai-core.

if (billing.provider() === "ai-core") console.log("using ai-core's own bills");

На этой странице