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.
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
money.transfer(from: MoneyRef, to: MoneyRef, amount: number, reason?: string, fee?: number): booleanBrak 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
banking.open(source: number): booleanlocal 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
banking.societyBalance(job: string): number | nulllocal balance = aiLib.banking.societyBalance(job) -- liczba albo nilZwraca 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
banking.provider(): string | nulllocal 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
billing.send(bill: BillRequest): booleanlocal 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)
billing.unpaid(source: number): Promise<UnpaidBill[] | null>local bills = aiLib.billing.unpaid(source) -- table[] albo nil, wywołuj wewnątrz wątkuZwraca 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
billing.pay(source: number, id: string): booleanlocal 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
billing.provider(): string | nulllocal 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");