AI Core
API-ReferenzAI Core: Server-Exports

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()

Signature
GetBillingSystem(): string | null
Lua
local system = exports['ai-core']:GetBillingSystem() -- 'ai-core' oder ein Skriptname

Parameter

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

Signature
SendBill(bill: BillRequest): boolean
Lua
local 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, kein label, amount keine ganze Zahl von 1 bis 10.000.000, weder job noch from, oder from gleich dem Empfänger;
  • from angegeben ist, aber keinen geladenen Charakter hat, oder job nicht 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

Signature
GetUnpaidBills(source: number, done: (bills: UnpaidBill[] | null) => void): void
Lua
exports['ai-core']:GetUnpaidBills(source, function(bills) end) -- Liste oder nil

Parameter

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

Signature
PayBill(source: number, id: string): boolean
Lua
local 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")),
);

Auf dieser Seite