Rechnungen
Rechnungen senden (Bußgelder, Servicegebühren, Spielerrechnungen), die offenen Rechnungen eines Spielers auflisten und bezahlen, über das laufende Rechnungs-Skript oder die eigenen Rechnungen von ai-core.
Rechnungen laufen über ai-core, nie über die eigenen Exports oder Events eines Rechnungs-Skripts. ai-core sendet jede Rechnung an das aktive Rechnungs-Skript: das, das die Panel-Einstellung Billing script (Rechnungs-Skript) wählt, oder das erste, das läuft. Ohne eines übernehmen die eigenen Rechnungen von ai-core: Der Spieler sieht eine Liste offener Rechnungen auf dem Bildschirm, und das Geld bewegt sich, wenn er bezahlt. Eine Rechnung geht nie ins Leere.
Eine Rechnung kommt von einem Job (das bank-Konto des Jobs erhält die Zahlung: Polizei-Bußgelder, die Gebühr eines Mechanikers) oder von einem Spieler (dieser Spieler erhält die Zahlung).
Die eigenen Rechnungen von ai-core in Kürze: Offene Rechnungen werden pro Charakter gespeichert (auch für Offline-Charaktere), höchstens 20 offene Rechnungen pro Charakter, und beim Bezahlen wird das Geld zuerst von bank, dann von cash genommen, in einer Transaktion zusammen mit dem Entfernen der Rechnung.
GetBillingSystem
Wohin Rechnungen gehen.
Seite: Server · Wartet: nein · Lib: billing.provider()
GetBillingSystem(): string | nulllocal system = exports['ai-core']:GetBillingSystem() -- 'ai-core' oder ein SkriptnameParameter
Keine.
Rückgabe
string | null: der Ressourcenname des Rechnungs-Skripts oder "ai-core" für die eigenen Rechnungen von ai-core. Da die eigenen Rechnungen von ai-core immer verfügbar sind, ist das in der Praxis nie null.
Beispiel
import { resourceExport } from "@aicore-fivem/lib/server";
const core = resourceExport("ai-core");
/** Rechnungen an Offline-Charaktere funktionieren nur mit den eigenen Rechnungen von ai-core. */
export function canBillOffline(): boolean {
return core.GetBillingSystem() === "ai-core";
}SendBill
Sendet einem Spieler eine Rechnung.
Seite: Server · Wartet: nein · Lib: billing.send
SendBill(bill: BillRequest): booleanlocal sent = exports['ai-core']:SendBill({ to = target, amount = 250, label = 'Speeding', from = source, job = 'police' })Parameter
Prop
Type
BillRequest
Prop
Type
Siehe BillRequest.
Rückgabe
boolean: true, wenn die Rechnung gesendet wurde. false, wenn:
- die Rechnung ungültig ist: beide oder keines von
to/toCitizenid, keinlabel,amountkeine ganze Zahl von 1 bis 10.000.000, wederjobnochfrom, oderfromgleich dem Empfänger; fromangegeben ist, aber keinen geladenen Charakter hat, oderjobnicht existiert;- der Empfänger offline ist und Rechnungen an ein Rechnungs-Skript gehen (nur die eigenen Rechnungen von ai-core erreichen Offline-Charaktere);
- das Rechnungs-Skript sie abgelehnt hat oder der Empfänger bei den eigenen Rechnungen von ai-core bereits 20 offene Rechnungen hat.
Eine Offline-Rechnung über die eigenen Rechnungen von ai-core antwortet true, sobald sie gültig ist; die Datenbank kann sie trotzdem ablehnen (unbekannte Citizen-ID, 20 offene Rechnungen), was geloggt wird.
Beispiel
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");
// Ein Beamter verhängt ein Bußgeld gegen den Spieler vor sich; das Polizeikonto erhält das Geld.
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");
},
);Nimm dem Ziel nie selbst Geld als „Zwangsrechnung“ ab (TransferMoney von seinem Konto): Eine Rechnung ist die Entscheidung des Spielers, zu bezahlen.
GetUnpaidBills
Die offenen (unbezahlten) Rechnungen eines Spielers.
Seite: Server · Wartet: nein (antwortet über done) · Lib: billing.unpaid(source) gibt ein Promise zurück
GetUnpaidBills(source: number, done: (bills: UnpaidBill[] | null) => void): voidexports['ai-core']:GetUnpaidBills(source, function(bills) end) -- Liste oder nilParameter
Prop
Type
Rückgabe
Nichts. done erhält einen Eintrag pro offener Rechnung mit id (die ID des Rechnungs-Skripts), label, amount (was noch geschuldet wird) und sender (Job-Label oder Spielername) (UnpaidBill), oder null, wenn der Spieler keinen geladenen Charakter hat oder das Rechnungs-Skript keine Rechnungen auflisten kann. Ohne eine Funktion als done tut der Aufruf nichts.
Beispiel
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");
// Ein Schalter im Rathaus zeigt, was der Spieler schuldet.
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
Der Spieler bezahlt eine seiner offenen Rechnungen.
Seite: Server · Wartet: nein · Lib: billing.pay
PayBill(source: number, id: string): booleanlocal paid = exports['ai-core']:PayBill(source, billId)Parameter
Prop
Type
Rückgabe
boolean: true, wenn die Rechnung bezahlt wurde. false, wenn der Spieler keinen geladenen Charakter hat, die Rechnung nicht seine ist oder nicht mehr existiert, er sie nicht bezahlen kann, das Rechnungs-Skript abgelehnt hat oder Zahlungen nur auf seinem eigenen Bildschirm annimmt. Bei den eigenen Rechnungen von ai-core braucht eine persönliche Rechnung außerdem den Aussteller online (das Geld geht auf seine Bank).
Beispiel
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")),
);