AI Core
Dokumentacja APILib: serwer

Pieniądze i bankowość

money.transfer między dwoma kontami, skrypt bankowy przez ai-core i rachunki przez dowolny skrypt rachunków, który działa.

TypeScript
import { money, banking, billing } from "@aicore-fivem/lib/server";

Zmiany jednego konta gracza (dodanie, zabranie, odczyt salda) to eksporty ai-core (AddMoney, RemoveMoney, GetMoney; zobacz Eksporty serwerowe ai-core). Lib dodaje to, co wymaga więcej niż jednej zmiany konta, oraz warstwy bankowości i rachunków.

money

money.transfer

Przenosi pieniądze z jednego konta na drugie w jednej transakcji bazy danych, z wierszem w księdze po obu stronach. Używaj go dla wszystkiego, gdzie pieniądze nie mogą pojawić się ani zniknąć w połowie: płatność innemu graczowi, premia wypłacana przez pracę, opłata.

Strona: Serwer · Czeka: nie

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

Brak odpowiednika w Lua: wywołaj eksport ai-core exports['ai-core']:TransferMoney(from, to, amount, reason, fee).

Parametry

Prop

Type

Zwracana wartość

boolean: true, gdy oba wiersze zostały zapisane. false, gdy kwota nie jest liczbą całkowitą, brakuje konta, oba są tym samym kontem albo from nie może zapłacić amount plus fee.

Przykład

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 rozmawia ze skryptem bankowym przez warstwę bankowości ai-core. Same pieniądze pracy zawsze przechodzą przez money albo eksporty ai-core.

banking.open

Otwiera ekran skryptu bankowego dla gracza.

Strona: Serwer · Czeka: nie

Sygnatura
banking.open(source: number): boolean
Lua
local ok = aiLib.banking.open(source)

Zwraca true, gdy otwarto. false, gdy skryptu nie da się otworzyć z zewnątrz albo żaden nie działa.

onClientCallback("my-atm:open", (source) => (banking.open(source) ? { ok: true } : fail("BANK_UNAVAILABLE")));

banking.societyBalance

Saldo konta firmy pracy, do wyświetlenia. W trybie kont core ai-core to konto pracy w ai-core; w trybie own własne konto skryptu bankowego.

Strona: Serwer · Czeka: nie

Sygnatura
banking.societyBalance(job: string): number | null
Lua
local balance = aiLib.banking.societyBalance(job) -- liczba albo nil

Zwraca saldo albo null (Lua nil), gdy żaden nie działa albo skrypt go nie prowadzi.

const balance = banking.societyBalance("mechanic") ?? 0;

banking.provider

Strona: Serwer · Czeka: nie

Sygnatura
banking.provider(): string | null
Lua
local name = aiLib.banking.provider()

Zwraca skrypt bankowy, którego używa warstwa, albo null.

console.log(`banking through ${banking.provider() ?? "nothing"}`);

billing

billing wysyła rachunki przez dowolny skrypt rachunków, który działa; bez niego przez własne rachunki ai-core (gracz płaci z listy na ekranie, pieniądze przechodzą, gdy zapłaci). Teksty są już przetłumaczone.

billing.send

Wysyła rachunek od pracy (mandaty, opłaty za usługi) albo od gracza.

Strona: Serwer · Czeka: nie

Sygnatura
billing.send(bill: BillRequest): boolean
Lua
local ok = aiLib.billing.send(bill)

BillRequest

Prop

Type

Zwracana wartość

boolean: true, gdy wysłano, false, gdy nieprawidłowy albo odrzucony.

Przykład

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

Otwarte rachunki gracza.

Strona: Serwer · Czeka: tak (Promise w TypeScript, w Lua wstrzymuje wątek)

Sygnatura
billing.unpaid(source: number): Promise<UnpaidBill[] | null>
Lua
local bills = aiLib.billing.unpaid(source) -- table[] albo nil, wywołuj wewnątrz wątku

Zwraca UnpaidBill[] (id, label, amount nadal do zapłaty, sender) albo null, gdy skrypt rachunków nie potrafi ich wymienić.

const bills = await billing.unpaid(source);
const owed = bills?.reduce((sum, bill) => sum + bill.amount, 0) ?? 0;

billing.pay

Gracz płaci jeden ze swoich otwartych rachunków.

Strona: Serwer · Czeka: nie

Sygnatura
billing.pay(source: number, id: string): boolean
Lua
local ok = aiLib.billing.pay(source, id)

Prop

Type

Zwraca true, gdy zapłacono. false, gdy odrzucono (za mało pieniędzy, nieznany rachunek) albo skrypt rachunków przyjmuje płatności tylko na własnym ekranie.

if (!billing.pay(source, billId)) return fail("PAY_FAILED");

billing.provider

Strona: Serwer · Czeka: nie

Sygnatura
billing.provider(): string | null
Lua
local name = aiLib.billing.provider()

Zwraca skrypt rachunków, do którego trafiają rachunki, "ai-core" dla własnych rachunków ai-core.

if (billing.provider() === "ai-core") console.log("using ai-core's own bills");

Na tej stronie