Faturalar
Çalışan fatura script’i ya da ai-core’un kendi faturaları üzerinden fatura gönder (cezalar, hizmet ücretleri, oyuncu faturaları), bir oyuncunun açık faturalarını listele ve öde.
Faturalar ai-core üzerinden gider, asla bir fatura script’inin kendi export’ları ya da event’leri üzerinden değil. ai-core her faturayı aktif fatura script’ine gönderir: panelin Billing script ayarının seçtiği ya da çalışan ilk script. Hiçbiri yoksa faturayı ai-core’un kendi faturaları alır: oyuncu ekranda açık faturaların bir listesini görür ve ödediğinde para hareket eder. Bir fatura asla boşa gitmez.
Bir fatura bir meslekten (ödemeyi mesleğin bank hesabı alır: polis cezaları, bir tamircinin ücreti) ya da bir oyuncudan (ödemeyi o oyuncu alır) gelir.
Kısaca ai-core’un kendi faturaları: açık faturalar karakter başına saklanır (çevrimdışı karakterler dahil), karakter başına en fazla 20 açık fatura olur ve ödeme parayı önce bank’tan, sonra cash’ten, faturanın silinmesiyle tek bir transaction içinde alır.
GetBillingSystem
Faturaların nereye gittiği.
Taraf: Server · Bekler: hayır · Lib: billing.provider()
GetBillingSystem(): string | nulllocal system = exports['ai-core']:GetBillingSystem() -- 'ai-core' ya da bir script adıParametreler
Yok.
Dönüş değeri
string | null: fatura script’inin resource adı ya da ai-core’un kendi faturaları için "ai-core". ai-core’un kendi faturaları her zaman mevcut olduğundan pratikte bu null olmaz.
Örnek
import { resourceExport } from "@aicore-fivem/lib/server";
const core = resourceExport("ai-core");
/** Çevrimdışı karakterlere faturalar yalnızca ai-core’un kendi faturalarıyla çalışır. */
export function canBillOffline(): boolean {
return core.GetBillingSystem() === "ai-core";
}SendBill
Bir oyuncuya fatura gönderir.
Taraf: Server · Bekler: hayır · Lib: billing.send
SendBill(bill: BillRequest): booleanlocal sent = exports['ai-core']:SendBill({ to = target, amount = 250, label = 'Speeding', from = source, job = 'police' })Parametreler
Prop
Type
BillRequest
Prop
Type
Bkz. BillRequest.
Dönüş değeri
boolean: fatura gönderildiğinde true. Şu durumlarda false:
- fatura geçersiz:
to/toCitizenid’den ikisi birden ya da hiçbiri,labelyok,amount1 ile 10,000,000 arası bir tam sayı değil, nejobnefromvar ya dafromalıcıya eşit; fromverilmiş ama yüklü bir karakteri yok ya dajobmevcut değil;- alıcı çevrimdışı ve faturalar bir fatura script’ine gidiyor (çevrimdışı karakterlere yalnızca ai-core’un kendi faturaları ulaşır);
- fatura script’i reddetti ya da alıcının ai-core’un kendi faturalarında zaten 20 açık faturası var.
ai-core’un kendi faturalarıyla çevrimdışı bir fatura, geçerli olduğu anda true cevabı verir; veritabanı yine de reddedebilir (bilinmeyen citizen id, 20 açık fatura), bu da loglanır.
Örnek
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");
// Bir memur önündeki oyuncuya ceza keser; parayı polis hesabı alır.
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");
},
);Hedeften parayı asla "zorla fatura" olarak kendin alma (onun hesabından TransferMoney): fatura, oyuncunun ödeme tercihidir.
GetUnpaidBills
Bir oyuncunun açık (ödenmemiş) faturaları.
Taraf: Server · Bekler: hayır (done ile cevap verir) · Lib: billing.unpaid(source) bir Promise döndürür
GetUnpaidBills(source: number, done: (bills: UnpaidBill[] | null) => void): voidexports['ai-core']:GetUnpaidBills(source, function(bills) end) -- liste ya da nilParametreler
Prop
Type
Dönüş değeri
Hiçbir şey. done her açık fatura için bir kayıt alır: id (fatura script’inin id’si), label, amount (hâlâ borçlu olunan) ve sender (meslek etiketi ya da oyuncu adı) (UnpaidBill); oyuncunun yüklü karakteri yoksa ya da fatura script’i faturaları listeleyemiyorsa null alır. done olarak bir fonksiyon verilmezse çağrı hiçbir şey yapmaz.
Örnek
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");
// Bir belediye gişesi oyuncunun borcunu gösterir.
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
Oyuncu açık faturalarından birini öder.
Taraf: Server · Bekler: hayır · Lib: billing.pay
PayBill(source: number, id: string): booleanlocal paid = exports['ai-core']:PayBill(source, billId)Parametreler
Prop
Type
Dönüş değeri
boolean: fatura ödendiğinde true. Oyuncunun yüklü karakteri yoksa, fatura onun değilse ya da artık yoksa, ödeyemiyorsa, fatura script’i reddettiyse ya da ödemeleri yalnızca kendi ekranında alıyorsa false. ai-core’un kendi faturalarında kişisel bir fatura ayrıca kesenin çevrimiçi olmasını gerektirir (para onun bankasına gider).
Örnek
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")),
);