Faturas
Envie faturas (multas, taxas de serviço, cobranças entre jogadores), liste e pague as faturas em aberto de um jogador, pelo script de faturas que estiver rodando ou pelas faturas próprias do ai-core.
As faturas passam pelo ai-core, nunca pelos exports ou eventos próprios de um script de faturas. O ai-core envia cada fatura ao script de faturas ativo: o que a configuração Billing script do painel escolhe, ou o primeiro que estiver rodando. Sem nenhum, as faturas próprias do ai-core assumem: o jogador vê uma lista de faturas em aberto na tela e o dinheiro se move quando ele paga. Uma fatura nunca se perde.
Uma fatura vem de um emprego (a conta bank do emprego recebe o pagamento: multas da polícia, a taxa de um mecânico) ou de um jogador (esse jogador recebe o pagamento).
As faturas próprias do ai-core em resumo: as faturas em aberto são gravadas por personagem (personagens offline também), no máximo 20 faturas em aberto por personagem, e pagar tira o dinheiro de bank, depois de cash, numa só transação junto com a remoção da fatura.
GetBillingSystem
Para onde vão as faturas.
Lado: Servidor · Espera: não · Lib: billing.provider()
GetBillingSystem(): string | nulllocal system = exports['ai-core']:GetBillingSystem() -- 'ai-core' ou o nome de um scriptParâmetros
Nenhum.
Retorno
string | null: o nome do recurso do script de faturas, ou "ai-core" para as faturas próprias do ai-core. Como as faturas próprias do ai-core estão sempre disponíveis, na prática isto não é null.
Exemplo
import { resourceExport } from "@aicore-fivem/lib/server";
const core = resourceExport("ai-core");
/** Bills to offline characters only work with ai-core's own bills. */
export function canBillOffline(): boolean {
return core.GetBillingSystem() === "ai-core";
}SendBill
Envia uma fatura a um jogador.
Lado: Servidor · Espera: não · Lib: billing.send
SendBill(bill: BillRequest): booleanlocal sent = exports['ai-core']:SendBill({ to = target, amount = 250, label = 'Speeding', from = source, job = 'police' })Parâmetros
Prop
Type
BillRequest
Prop
Type
Veja BillRequest.
Retorno
boolean: true quando a fatura foi enviada. false quando:
- a fatura é inválida: os dois ou nenhum de
to/toCitizenid, semlabel,amountnão é um número inteiro de 1 a 10.000.000, nemjobnemfrom, oufromigual ao destinatário; fromfoi informado mas não tem personagem carregado, oujobnão existe;- o destinatário está offline e as faturas vão para um script de faturas (só as faturas próprias do ai-core chegam a personagens offline);
- o script de faturas a recusou, ou o destinatário já tem 20 faturas em aberto nas faturas próprias do ai-core.
Uma fatura offline nas faturas próprias do ai-core responde true assim que é válida; o banco de dados ainda pode recusá-la (citizen id desconhecido, 20 faturas em aberto), o que é registrado no log.
Exemplo
import { onClientCallback, coordsOf, isNear, resourceExport } from "@aicore-fivem/lib/server";
import { fail, readId, readInt } from "@aicore-fivem/lib/shared";
import { Locale } from "common";
const core = resourceExport("ai-core");
// Um policial multa o jogador à sua frente; a conta da polícia recebe o dinheiro.
onClientCallback(
"myscript:fine",
{
args: ([target, amount]) => {
const t = readId(target);
const a = readInt(amount, 1, 50_000);
return t === null || a === null ? null : [t, a];
},
},
(source, target, amount) => {
if (core.GetDutyJob(source) !== "police") return fail("NOT_POLICE");
if (!isNear(target, coordsOf(source), 3)) return fail("TOO_FAR");
const sent = core.SendBill({ to: target, amount, label: Locale("BILL_FINE"), from: source, job: "police" });
return sent ? { ok: true } : fail("BILL_FAILED");
},
);Nunca tire dinheiro do alvo você mesmo como uma "fatura forçada" (TransferMoney da conta dele): uma fatura é a escolha do jogador de pagar.
GetUnpaidBills
As faturas em aberto (não pagas) de um jogador.
Lado: Servidor · Espera: não (responde por done) · Lib: billing.unpaid(source) retorna uma Promise
GetUnpaidBills(source: number, done: (bills: UnpaidBill[] | null) => void): voidexports['ai-core']:GetUnpaidBills(source, function(bills) end) -- lista ou nilParâmetros
Prop
Type
Retorno
Nada. done recebe uma entrada por fatura em aberto com id (o id do script de faturas), label, amount (o que ainda é devido) e sender (rótulo do emprego ou nome do jogador) (UnpaidBill), ou null quando o jogador não tem personagem carregado ou o script de faturas não consegue listar faturas. Sem uma função como done a chamada não faz nada.
Exemplo
import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
import type { UnpaidBill } from "@aicore-fivem/shared";
const core = resourceExport("ai-core");
// Um balcão da prefeitura mostra o que o jogador deve.
onClientCallback("myscript:myBills", async (source) => {
const bills = await new Promise<UnpaidBill[] | null>((resolve) => core.GetUnpaidBills(source, resolve));
if (!bills) return fail("BILLS_UNAVAILABLE");
return { ok: true, bills, total: bills.reduce((sum, b) => sum + b.amount, 0) };
});PayBill
O jogador paga uma das faturas em aberto dele.
Lado: Servidor · Espera: não · Lib: billing.pay
PayBill(source: number, id: string): booleanlocal paid = exports['ai-core']:PayBill(source, billId)Parâmetros
Prop
Type
Retorno
boolean: true quando a fatura foi paga. false quando o jogador não tem personagem carregado, a fatura não é dele ou não existe mais, ele não consegue pagá-la, o script de faturas recusou ou só aceita pagamentos na própria tela. Nas faturas próprias do ai-core, uma fatura pessoal também exige o emissor online (o dinheiro vai para o banco dele).
Exemplo
import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail, readText } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
onClientCallback(
"myscript:payBill",
{ args: ([id]) => { const v = readText(id, 64); return v ? [v] : null; }, lock: true },
(source, id) => (core.PayBill(source, id) ? { ok: true } : fail("BILL_NOT_PAID")),
);