AI Core
Dokumentacja APIAI Core: eksporty serwerowe

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

Sygnatura
GetBillingSystem(): string | null
Lua
local system = exports['ai-core']:GetBillingSystem() -- 'ai-core' albo nazwa skryptu

Parametry

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

Sygnatura
SendBill(bill: BillRequest): boolean
Lua
local 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, brak label, amount nie jest liczbą całkowitą od 1 do 10 000 000, brak zarówno job, jak i from albo from równe odbiorcy;
  • from jest podane, ale nie ma wczytanej postaci, albo job nie 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

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

Parametry

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

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

Na tej stronie