AI Core
API başvurusuAI Core: server export’ları

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

İmza
GetBillingSystem(): string | null
Lua
local 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

İmza
SendBill(bill: BillRequest): boolean
Lua
local 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, label yok, amount 1 ile 10,000,000 arası bir tam sayı değil, ne job ne from var ya da from alıcıya eşit;
  • from verilmiş ama yüklü bir karakteri yok ya da job mevcut 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

İmza
GetUnpaidBills(source: number, done: (bills: UnpaidBill[] | null) => void): void
Lua
exports['ai-core']:GetUnpaidBills(source, function(bills) end) -- liste ya da nil

Parametreler

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

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

Bu sayfada