Para ve bankacılık
İki hesap arasında money.transfer, ai-core üzerinden banka script’i ve hangi fatura script’i çalışıyorsa onun üzerinden faturalar.
import { money, banking, billing } from "@aicore-fivem/lib/server";Bir oyuncunun tek hesaplık değişiklikleri (ekleme, çıkarma, bakiye okuma) ai-core’un export’larıdır (AddMoney, RemoveMoney, GetMoney; bkz. ai-core server export’ları). Lib, birden fazla hesap değişikliği gerektiren şeyleri ve bankacılık ile fatura katmanlarını ekler.
money
money.transfer
Parayı tek bir veritabanı transaction’ında, iki tarafta da bir defter satırıyla bir hesaptan diğerine taşır. Paranın yarı yolda ortaya çıkmaması ya da kaybolmaması gereken her şey için kullan: başka bir oyuncuya ödeme, bir mesleğin prim ödemesi, bir ücret.
Taraf: Server · Bekler: hayır
money.transfer(from: MoneyRef, to: MoneyRef, amount: number, reason?: string, fee?: number): booleanLua karşılığı yok: ai-core’un exports['ai-core']:TransferMoney(from, to, amount, reason, fee) export’unu çağır.
Parametreler
Prop
Type
Dönüş değeri
boolean: iki satır da yazıldıysa true. Bir miktar tam sayı değilse, bir hesap yoksa, ikisi aynıysa ya da from amount artı fee’yi ödeyemiyorsa false.
Örnek
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, ai-core’un bankacılık katmanı üzerinden banka script’iyle konuşur. Meslek parasının kendisi her zaman money ya da ai-core’un export’ları üzerinden hareket eder.
banking.open
Banka script’inin ekranını bir oyuncu için açar.
Taraf: Server · Bekler: hayır
banking.open(source: number): booleanlocal ok = aiLib.banking.open(source)Dönüş değeri: açıldıysa true. Script dışarıdan açılamıyorsa ya da hiçbiri çalışmıyorsa false.
onClientCallback("my-atm:open", (source) => (banking.open(source) ? { ok: true } : fail("BANK_UNAVAILABLE")));banking.societyBalance
Görüntülemek için bir mesleğin şirket (society) bakiyesi. ai-core’un core hesap modunda ai-core’un meslek hesabıdır; own modunda banka script’inin kendi hesabı.
Taraf: Server · Bekler: hayır
banking.societyBalance(job: string): number | nulllocal balance = aiLib.banking.societyBalance(job) -- number ya da nilDönüş değeri: bakiye ya da hiçbiri çalışmıyorsa veya script bakiye tutmuyorsa null (Lua’da nil).
const balance = banking.societyBalance("mechanic") ?? 0;banking.provider
Taraf: Server · Bekler: hayır
banking.provider(): string | nulllocal name = aiLib.banking.provider()Dönüş değeri: katmanın kullandığı banka script’i ya da null.
console.log(`banking through ${banking.provider() ?? "nothing"}`);billing
billing, faturaları hangi fatura script’i çalışıyorsa onun üzerinden gönderir; hiçbiri yoksa ai-core’un kendi faturaları kullanılır (oyuncu ekrandaki bir listeden öder, para o ödediğinde hareket eder). Metinler zaten çevrilmiş haldedir.
billing.send
Bir meslekten (cezalar, hizmet ücretleri) ya da bir oyuncudan fatura gönderir.
Taraf: Server · Bekler: hayır
billing.send(bill: BillRequest): booleanlocal ok = aiLib.billing.send(bill)BillRequest
Prop
Type
Dönüş değeri
boolean: gönderildiyse true, geçersizse ya da reddedildiyse false.
Örnek
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
Oyuncunun açık faturaları.
Taraf: Server · Bekler: evet (TypeScript’te Promise, Lua’da thread’i yield eder)
billing.unpaid(source: number): Promise<UnpaidBill[] | null>local bills = aiLib.billing.unpaid(source) -- table[] ya da nil, bir thread içinde çağırDönüş değeri: UnpaidBill[] (id, label, hâlâ borçlu olunan amount, sender) ya da fatura script’i onları listeleyemiyorsa null.
const bills = await billing.unpaid(source);
const owed = bills?.reduce((sum, bill) => sum + bill.amount, 0) ?? 0;billing.pay
Oyuncu açık faturalarından birini öder.
Taraf: Server · Bekler: hayır
billing.pay(source: number, id: string): booleanlocal ok = aiLib.billing.pay(source, id)Prop
Type
Dönüş değeri: ödendiyse true. Reddedildiyse (yetersiz para, bilinmeyen fatura) ya da fatura script’i ödemeleri yalnızca kendi ekranında alıyorsa false.
if (!billing.pay(source, billId)) return fail("PAY_FAILED");billing.provider
Taraf: Server · Bekler: hayır
billing.provider(): string | nulllocal name = aiLib.billing.provider()Dönüş değeri: faturaların gittiği fatura script’i; ai-core’un kendi faturaları için "ai-core".
if (billing.provider() === "ai-core") console.log("using ai-core's own bills");