Rachunki
Wysyłaj rachunki (mandaty, opłaty za usługi, faktury graczy), wyświetlaj i opłacaj otwarte rachunki gracza przez działający skrypt rachunków albo własne rachunki ai-core.
Rachunki przechodzą przez ai-core, nigdy przez własne eksporty lub zdarzenia skryptu rachunków. ai-core wysyła każdy rachunek do aktywnego skryptu rachunków: tego, który wybiera ustawienie Billing script w panelu, albo pierwszego działającego. Bez niego rachunek przejmują własne rachunki ai-core: gracz widzi na ekranie listę otwartych rachunków, a pieniądze przechodzą, gdy płaci. Rachunek nigdy nie trafia donikąd.
Rachunek przychodzi od pracy (płatność dostaje konto bank pracy: mandaty policyjne, opłata mechanika) albo od gracza (płatność dostaje ten gracz).
Własne rachunki ai-core w skrócie: otwarte rachunki są zapisywane dla każdej postaci (także postaci offline), najwyżej 20 otwartych rachunków na postać, a płatność pobiera pieniądze z bank, potem z cash, w jednej transakcji z usunięciem rachunku.
GetBillingSystem
Dokąd idą rachunki.
Strona: Serwer · Czeka: nie · Lib: billing.provider()
GetBillingSystem(): string | nulllocal system = exports['ai-core']:GetBillingSystem() -- 'ai-core' albo nazwa skryptuParametry
Brak.
Zwraca
string | null: nazwa zasobu skryptu rachunków albo "ai-core" dla własnych rachunków ai-core. Ponieważ własne rachunki ai-core są zawsze dostępne, w praktyce to nie jest null.
Przykład
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
Wysyła rachunek do gracza.
Strona: Serwer · Czeka: nie · Lib: billing.send
SendBill(bill: BillRequest): booleanlocal sent = exports['ai-core']:SendBill({ to = target, amount = 250, label = 'Speeding', from = source, job = 'police' })Parametry
Prop
Type
BillRequest
Prop
Type
Zobacz BillRequest.
Zwraca
boolean: true, gdy rachunek został wysłany. false, gdy:
- rachunek jest niepoprawny: oba lub żadne z
to/toCitizenid, braklabel,amountnie jest liczbą całkowitą od 1 do 10 000 000, brak zarównojob, jak ifromalbofromrówne odbiorcy; fromjest podane, ale nie ma wczytanej postaci, albojobnie istnieje;- odbiorca jest offline, a rachunki idą do skryptu rachunków (tylko własne rachunki ai-core docierają do postaci offline);
- skrypt rachunków go odrzucił albo odbiorca ma już 20 otwartych rachunków we własnych rachunkach ai-core.
Rachunek offline we własnych rachunkach ai-core odpowiada true, gdy jest poprawny; baza danych może go jeszcze odrzucić (nieznane citizen id, 20 otwartych rachunków), co jest zapisywane w logu.
Przykład
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");
// Funkcjonariusz wystawia mandat graczowi przed sobą; konto policji dostaje pieniądze.
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");
},
);Nigdy nie zabieraj sam pieniędzy celowi jako "przymusowy rachunek" (TransferMoney z jego konta): rachunek to wybór gracza, czy zapłacić.
GetUnpaidBills
Otwarte (niezapłacone) rachunki gracza.
Strona: Serwer · Czeka: nie (odpowiada przez done) · Lib: billing.unpaid(source) zwraca Promise
GetUnpaidBills(source: number, done: (bills: UnpaidBill[] | null) => void): voidexports['ai-core']:GetUnpaidBills(source, function(bills) end) -- lista lub nilParametry
Prop
Type
Zwraca
Nic. done dostaje jeden wpis na otwarty rachunek z id (id skryptu rachunków), label, amount (ile jest jeszcze do zapłaty) i sender (etykieta pracy lub nazwa gracza) (UnpaidBill) albo null, gdy gracz nie ma wczytanej postaci lub skrypt rachunków nie umie wyświetlić rachunków. Bez funkcji jako done wywołanie nic nie robi.
Przykład
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");
// Okienko w ratuszu pokazuje, ile gracz jest winien.
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
Gracz płaci jeden ze swoich otwartych rachunków.
Strona: Serwer · Czeka: nie · Lib: billing.pay
PayBill(source: number, id: string): booleanlocal paid = exports['ai-core']:PayBill(source, billId)Parametry
Prop
Type
Zwraca
boolean: true, gdy rachunek został zapłacony. false, gdy gracz nie ma wczytanej postaci, rachunek nie jest jego albo już go nie ma, gracz nie może go zapłacić, skrypt rachunków odmówił albo przyjmuje płatności tylko na swoim ekranie. We własnych rachunkach ai-core rachunek osobisty wymaga też, aby wystawiający był online (pieniądze trafiają na jego konto bankowe).
Przykład
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")),
);