Geld und Banking
money.transfer zwischen zwei Konten, das Banking-Skript über ai-core und Rechnungen über das jeweils laufende Rechnungs-Skript.
import { money, banking, billing } from "@aicore-fivem/lib/server";Änderungen an einem einzelnen Konto eines Spielers (hinzufügen, abziehen, Kontostand lesen) sind Exports von ai-core (AddMoney, RemoveMoney, GetMoney; siehe Server-Exports von ai-core). Die Lib ergänzt, was mehr als eine Kontoänderung braucht, sowie die Banking- und Rechnungs-Ebenen.
money
money.transfer
Bewegt Geld in einer einzigen Datenbanktransaktion von einem Konto auf ein anderes, mit einer Buchungszeile auf beiden Seiten. Nutze es für alles, bei dem Geld nicht auf halbem Weg auftauchen oder verschwinden darf: einen anderen Spieler bezahlen, ein Job zahlt einen Bonus, eine Gebühr.
Seite: Server · Wartet: nein
money.transfer(from: MoneyRef, to: MoneyRef, amount: number, reason?: string, fee?: number): booleanKein Lua-Zwilling: Rufe den Export von ai-core auf, exports['ai-core']:TransferMoney(from, to, amount, reason, fee).
Parameter
Prop
Type
Rückgabewert
boolean: true, wenn beide Zeilen geschrieben wurden. false, wenn ein Betrag keine ganze Zahl ist, ein Konto fehlt, beide gleich sind oder from amount plus fee nicht zahlen kann.
Beispiel
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 spricht über die Banking-Ebene von ai-core mit dem Banking-Skript. Job-Geld selbst bewegt sich immer über money oder die Exports von ai-core.
banking.open
Öffnet den Bildschirm des Banking-Skripts für einen Spieler.
Seite: Server · Wartet: nein
banking.open(source: number): booleanlocal ok = aiLib.banking.open(source)Rückgabewert: true, wenn geöffnet. false, wenn das Skript nicht von außen geöffnet werden kann oder keins läuft.
onClientCallback("my-atm:open", (source) => (banking.open(source) ? { ok: true } : fail("BANK_UNAVAILABLE")));banking.societyBalance
Der Society-Kontostand eines Jobs, zur Anzeige. Im core-Kontomodus von ai-core ist es das Job-Konto von ai-core; im own-Modus das eigene des Banking-Skripts.
Seite: Server · Wartet: nein
banking.societyBalance(job: string): number | nulllocal balance = aiLib.banking.societyBalance(job) -- number oder nilRückgabewert: der Kontostand, oder null (Lua nil), wenn keins läuft oder das Skript keinen führt.
const balance = banking.societyBalance("mechanic") ?? 0;banking.provider
Seite: Server · Wartet: nein
banking.provider(): string | nulllocal name = aiLib.banking.provider()Rückgabewert: das Banking-Skript, das die Ebene nutzt, oder null.
console.log(`banking through ${banking.provider() ?? "nothing"}`);billing
billing sendet Rechnungen über das jeweils laufende Rechnungs-Skript; ohne eines die eigenen Rechnungen von ai-core (der Spieler zahlt aus einer Liste auf dem Bildschirm, das Geld bewegt sich, wenn er zahlt). Texte sind bereits übersetzt.
billing.send
Sendet eine Rechnung von einem Job (Bußgelder, Servicegebühren) oder von einem Spieler.
Seite: Server · Wartet: nein
billing.send(bill: BillRequest): booleanlocal ok = aiLib.billing.send(bill)BillRequest
Prop
Type
Rückgabewert
boolean: true, wenn gesendet, false, wenn ungültig oder abgelehnt.
Beispiel
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
Die offenen Rechnungen des Spielers.
Seite: Server · Wartet: ja (Promise in TypeScript, hält in Lua den Thread an)
billing.unpaid(source: number): Promise<UnpaidBill[] | null>local bills = aiLib.billing.unpaid(source) -- table[] oder nil, innerhalb eines Threads aufrufenRückgabewert: UnpaidBill[] (id, label, noch geschuldeter amount, sender), oder null, wenn das Rechnungs-Skript sie nicht auflisten kann.
const bills = await billing.unpaid(source);
const owed = bills?.reduce((sum, bill) => sum + bill.amount, 0) ?? 0;billing.pay
Der Spieler bezahlt eine seiner offenen Rechnungen.
Seite: Server · Wartet: nein
billing.pay(source: number, id: string): booleanlocal ok = aiLib.billing.pay(source, id)Prop
Type
Rückgabewert: true, wenn bezahlt. false, wenn abgelehnt (nicht genug Geld, unbekannte Rechnung) oder das Rechnungs-Skript Zahlungen nur in seinem eigenen Bildschirm annimmt.
if (!billing.pay(source, billId)) return fail("PAY_FAILED");billing.provider
Seite: Server · Wartet: nein
billing.provider(): string | nulllocal name = aiLib.billing.provider()Rückgabewert: das Rechnungs-Skript, an das Rechnungen gehen, "ai-core" für die eigenen Rechnungen von ai-core.
if (billing.provider() === "ai-core") console.log("using ai-core's own bills");