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.
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
money.transfer(from: MoneyRef, to: MoneyRef, amount: number, reason?: string, fee?: number): booleanSem 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
banking.open(source: number): booleanlocal 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
banking.societyBalance(job: string): number | nulllocal balance = aiLib.banking.societyBalance(job) -- number ou nilRetorno 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
banking.provider(): string | nulllocal 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
billing.send(bill: BillRequest): booleanlocal 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)
billing.unpaid(source: number): Promise<UnpaidBill[] | null>local bills = aiLib.billing.unpaid(source) -- table[] ou nil, chame dentro de uma threadRetorno 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
billing.pay(source: number, id: string): booleanlocal 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
billing.provider(): string | nulllocal 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");Veículos
spawnVehicle, vehicleType, randomPlate, veículos mais próximos, entidades a partir de net ids do cliente, vehicleKeys, combustível e garagens.
Empregos e serviços
Alertas da polícia, prisão, registros do MDT, médicos, reviver e curar, estresse, fome e sede, definições de empregos e gangues, horário nobre.