AI Core
API-ReferenzLib: Server

Geld und Banking

money.transfer zwischen zwei Konten, das Banking-Skript über ai-core und Rechnungen über das jeweils laufende Rechnungs-Skript.

TypeScript
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

Signatur
money.transfer(from: MoneyRef, to: MoneyRef, amount: number, reason?: string, fee?: number): boolean

Kein 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

Signatur
banking.open(source: number): boolean
Lua
local 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

Signatur
banking.societyBalance(job: string): number | null
Lua
local balance = aiLib.banking.societyBalance(job) -- number oder nil

Rü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

Signatur
banking.provider(): string | null
Lua
local 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

Signatur
billing.send(bill: BillRequest): boolean
Lua
local 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)

Signatur
billing.unpaid(source: number): Promise<UnpaidBill[] | null>
Lua
local bills = aiLib.billing.unpaid(source) -- table[] oder nil, innerhalb eines Threads aufrufen

Rü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

Signatur
billing.pay(source: number, id: string): boolean
Lua
local 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

Signatur
billing.provider(): string | null
Lua
local 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");

Auf dieser Seite