AI Core
Referência da APILib: servidor

Dinheiro e banco

money.transfer entre duas contas, o script de banco pelo ai-core e cobranças pelo script de cobrança que estiver rodando.

TypeScript
import { money, banking, billing } from "@aicore-fivem/lib/server";

As mudanças em uma única conta de um jogador (adicionar, remover, ler um saldo) são exports do ai-core (AddMoney, RemoveMoney, GetMoney; veja exports de servidor do ai-core). A lib adiciona o que precisa de mais de uma mudança de conta, e as camadas de banco e de cobrança.

money

money.transfer

Move dinheiro de uma conta para outra em uma única transação no banco de dados, com uma linha no extrato dos dois lados. Use para tudo em que o dinheiro não pode aparecer nem sumir no meio do caminho: pagar outro jogador, um emprego pagando um bônus, uma taxa.

Lado: Servidor · Espera: não

Signature
money.transfer(from: MoneyRef, to: MoneyRef, amount: number, reason?: string, fee?: number): boolean

Sem equivalente em Lua: chame o export do ai-core exports['ai-core']:TransferMoney(from, to, amount, reason, fee).

Parâmetros

Prop

Type

Retorno

boolean: true quando as duas linhas foram escritas. false quando um valor não é um número inteiro, uma conta não existe, as duas são a mesma, ou from não pode pagar amount mais fee.

Exemplo

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 conversa com o script de banco pela camada de banco do ai-core. O dinheiro dos empregos em si sempre se move por money ou pelos exports do ai-core.

banking.open

Abre a tela do script de banco para um jogador.

Lado: Servidor · Espera: não

Signature
banking.open(source: number): boolean
Lua
local ok = aiLib.banking.open(source)

Retorno true quando aberta. false quando o script não pode ser aberto de fora ou nenhum está rodando.

onClientCallback("my-atm:open", (source) => (banking.open(source) ? { ok: true } : fail("BANK_UNAVAILABLE")));

banking.societyBalance

O saldo da sociedade de um emprego, para exibição. No modo de conta core do ai-core é a conta do emprego no ai-core; no modo own, a do próprio script de banco.

Lado: Servidor · Espera: não

Signature
banking.societyBalance(job: string): number | null
Lua
local balance = aiLib.banking.societyBalance(job) -- number ou nil

Retorno o saldo, ou null (nil em Lua) quando nenhum está rodando ou o script não guarda saldo.

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

banking.provider

Lado: Servidor · Espera: não

Signature
banking.provider(): string | null
Lua
local name = aiLib.banking.provider()

Retorno o script de banco que a camada usa, ou null.

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

billing

billing envia cobranças pelo script de cobrança que estiver rodando; sem um, pelas próprias cobranças do ai-core (o jogador paga a partir de uma lista na tela, o dinheiro se move quando ele paga). Os textos já vêm traduzidos.

billing.send

Envia uma cobrança de um emprego (multas, taxas de serviço) ou de um jogador.

Lado: Servidor · Espera: não

Signature
billing.send(bill: BillRequest): boolean
Lua
local ok = aiLib.billing.send(bill)

BillRequest

Prop

Type

Retorno

boolean: true quando enviada, false quando inválida ou recusada.

Exemplo

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

As cobranças em aberto do jogador.

Lado: Servidor · Espera: sim (Promise em TypeScript, pausa a thread em Lua)

Signature
billing.unpaid(source: number): Promise<UnpaidBill[] | null>
Lua
local bills = aiLib.billing.unpaid(source) -- table[] ou nil, chame dentro de uma thread

Retorno UnpaidBill[] (id, label, amount ainda devido, sender), ou null quando o script de cobrança não consegue listá-las.

const bills = await billing.unpaid(source);
const owed = bills?.reduce((sum, bill) => sum + bill.amount, 0) ?? 0;

billing.pay

O jogador paga uma das suas cobranças em aberto.

Lado: Servidor · Espera: não

Signature
billing.pay(source: number, id: string): boolean
Lua
local ok = aiLib.billing.pay(source, id)

Prop

Type

Retorno true quando paga. false quando recusada (dinheiro insuficiente, cobrança desconhecida) ou o script de cobrança só aceita pagamentos na própria tela.

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

billing.provider

Lado: Servidor · Espera: não

Signature
billing.provider(): string | null
Lua
local name = aiLib.billing.provider()

Retorno o script de cobrança para onde as cobranças vão, "ai-core" para as próprias cobranças do ai-core.

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

Nesta página