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

Para ve hesaplar

Bir oyuncunun bakiyelerini, meslek ve çete hesaplarını oku ve değiştir, tek bir transaction içinde iki hesap arasında para taşı, hesap tiplerini oku.

Her karakterin hesap tipi başına bir bakiyesi vardır. Tipler admin panelinin Accounts listesinden gelir; yeni bir sunucuda cash, bank, black_money ve crypto vardır. Her meslek ve çetenin de her tipten bir hesabı vardır (şirket parası), boş başlar.

ai-core’da para nasıl çalışır:

  • Miktarlar tam sayıdır (dolar, kuruş yok). Kesirli bir sayı, NaN ya da JavaScript’in güvenli tam sayı aralığını aşan bir sayı reddedilir.
  • Bir değişiklik bellekte hemen uygulanır ve yaklaşık 50 ms içinde bir defter satırıyla (ai_core_transactions) birlikte veritabanına yazılır. Defter verdiğin reason’ı saklar; o yoksa çağıran resource’un adını saklar.
  • Hesap tipinin panelde Can go below zero ayarı açık değilse bakiye 0’ın altına inemez.
  • Bir oyuncunun hesabındaki her değişiklik ai-core:moneyChanged (src, account, balance, delta, reason) server event’ini tetikler ve oyuncunun kendi oyununa ulaşır. Bkz. Event’ler ve durum.

GetMoney

Bir oyuncunun tek bir hesaptaki bakiyesi.

Taraf: Server · Bekler: hayır · Lib: yok

İmza
GetMoney(src: number, account: string): number | null
Lua
local balance = exports['ai-core']:GetMoney(source, 'bank') -- sayı ya da nil

Parametreler

Prop

Type

Dönüş değeri

number | null: bakiye. Oyuncunun yüklü karakteri yoksa ya da hesap tipi yoksa null.

Örnek

import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");

onClientCallback("myscript:balance", (source) => {
  const bank = core.GetMoney(source, "bank");
  if (bank === null) return fail("NO_CHARACTER");
  return { ok: true, bank };
});

AddMoney

Bir oyuncunun hesabına para ekler. Ödüller, script’inin ödediği maaşlar ya da satış geliri için kullan.

Taraf: Server · Bekler: hayır · Lib: yok

İmza
AddMoney(src: number, account: string, amount: number, reason?: string): boolean
Lua
local ok = exports['ai-core']:AddMoney(source, 'cash', 250, 'fishing_sale')

Parametreler

Prop

Type

Dönüş değeri

boolean: para eklendiğinde true. Oyuncunun yüklü karakteri yoksa, hesap tipi yoksa ya da amount 0’ın üstünde bir tam sayı değilse false.

Örnek

import { onClientCallback, inventory, resourceExport, near } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");
const BUYER = { x: -1845.2, y: -1197.4, z: 14.3 };

onClientCallback("myscript:sellFish", { guards: [near(BUYER, 3)], lock: true }, (source) => {
  const fish = inventory.getItemCount(source, "fish");
  if (fish < 1) return fail("NO_FISH");
  if (!inventory.removeItem(source, "fish", fish)) return fail("SELL_FAILED");
  core.AddMoney(source, "cash", fish * 25, "fishing_sale");
  return { ok: true };
});

Parayı bir hesaptan diğerine taşımak için (bir oyuncunun bir mesleğe ödemesi, bir banka transferi) bir RemoveMoney + AddMoney çifti değil TransferMoney kullan: transfer tek bir veritabanı transaction’ıdır, çift ise iki ayrı değişiklik.

RemoveMoney

Bir oyuncunun hesabından para alır. Bir şeyin ücretini almak için kullan.

Taraf: Server · Bekler: hayır · Lib: yok

İmza
RemoveMoney(src: number, account: string, amount: number, reason?: string): boolean
Lua
local paid = exports['ai-core']:RemoveMoney(source, 'bank', 500, 'license_fee')

Parametreler

Prop

Type

Dönüş değeri

boolean: para alındığında true. Bakiye çok düşükse (ve hesap tipi negatif bakiyeye izin vermiyorsa), oyuncunun yüklü karakteri yoksa, hesap tipi yoksa ya da amount 0’ın üstünde bir tam sayı değilse false. false durumunda hiçbir şey değişmemiştir.

Örnek

import { onClientCallback, inventory, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");
const PRICE = 500;

onClientCallback("myscript:buyLicense", { lock: true }, (source) => {
  if (!inventory.canCarryItem(source, "driver_license")) return fail("NO_SPACE");
  if (!core.RemoveMoney(source, "bank", PRICE, "license_fee")) return fail("NOT_ENOUGH_MONEY");
  inventory.addItem(source, "driver_license");
  return { ok: true };
});

Parayı almadan önce başarısız olabilecek şeyleri kontrol et (envanterde yer, stok) ya da sonraki adım başarısız olduğunda parayı AddMoney ile geri ver.

SetMoney

Bir oyuncunun bakiyesini tam bir değere ayarlar. Admin araçları için kullan; oyun özellikleri ekleyip çıkarmalıdır.

Taraf: Server · Bekler: hayır · Lib: yok

İmza
SetMoney(src: number, account: string, amount: number, reason?: string): boolean
Lua
local ok = exports['ai-core']:SetMoney(source, 'cash', 0, 'admin_reset')

Parametreler

Prop

Type

Dönüş değeri

boolean: bakiye artık amount ise (zaten öyleyse de) true. Oyuncunun yüklü karakteri yoksa, hesap tipi yoksa, amount bir tam sayı değilse ya da buna izin vermeyen bir hesapta 0’ın altındaysa false.

Örnek

import { addCommand, resourceExport } from "@aicore-fivem/lib/server";

const core = resourceExport("ai-core");

addCommand("setcash", {
  help: "Sets a player cash",
  params: [{ name: "id", type: "playerId" }, { name: "amount", type: "number" }],
  restricted: true,
}, (_source, args) => {
  console.log(core.SetMoney(args.id, "cash", args.amount, "admin_set") ? "done" : "refused");
});

GetSharedMoney

Bir mesleğin ya da çetenin hesabının bakiyesi (şirket parası).

Taraf: Server · Bekler: hayır · Lib: yok (banking.societyBalance banka katmanına sorar, o da bunun yerine bir banka script’ini okuyabilir)

İmza
GetSharedMoney(ownerType: "job" | "gang", ownerId: string, account: string): number | null
Lua
local balance = exports['ai-core']:GetSharedMoney('job', 'police', 'bank') -- sayı ya da nil

Parametreler

Prop

Type

Dönüş değeri

number | null: bakiye. Meslek ya da çete veya hesap tipi yoksa (ya da hesapları henüz yüklenmediyse) null.

Örnek

import { onClientCallback, online, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");

// Bir patron menüsü mesleğin parasını gösterir; yalnızca mesleğin üyeleri sorabilir.
onClientCallback("myscript:societyBalance", (source) => {
  const job = online.dutyJob(source);
  if (!job) return fail("NOT_ON_DUTY");
  return { ok: true, balance: core.GetSharedMoney("job", job, "bank") ?? 0 };
});

Panelin Job and gang accounts ayarı The script's own accounts olduğunda mesleğin ve çetenin bank hesapları o script’te yaşar: bu export o zaman script’in bakiyesini okur. Bkz. Banka.

AddSharedMoney

Bir mesleğin ya da çetenin hesabına para ekler.

Taraf: Server · Bekler: hayır · Lib: yok

İmza
AddSharedMoney(
  ownerType: "job" | "gang",
  ownerId: string,
  account: string,
  amount: number,
  reason?: string,
): boolean
Lua
local ok = exports['ai-core']:AddSharedMoney('job', 'mechanic', 'bank', 300, 'repair_fee')

Parametreler

Prop

Type

Dönüş değeri

boolean: para eklendiğinde true. Meslek ya da çete veya hesap yoksa ya da amount 0’ın üstünde bir tam sayı değilse false.

Örnek

import { resourceExport } from "@aicore-fivem/lib/server";

const core = resourceExport("ai-core");

/** Bir NPC müşterinin yaptığı satış restoranın hesabına gider. */
export function restaurantSale(job: string, price: number): void {
  if (!core.AddSharedMoney("job", job, "bank", price, "npc_sale"))
    console.log(`job ${job} has no bank account`);
}

Bir oyuncu mesleğe ödeme yaptığında oyuncunun hesabından mesleğinkine TransferMoney kullan: tek transaction, iki defter satırı.

RemoveSharedMoney

Bir mesleğin ya da çetenin hesabından para alır.

Taraf: Server · Bekler: hayır · Lib: yok

İmza
RemoveSharedMoney(
  ownerType: "job" | "gang",
  ownerId: string,
  account: string,
  amount: number,
  reason?: string,
): boolean
Lua
local ok = exports['ai-core']:RemoveSharedMoney('job', 'police', 'bank', 2000, 'equipment')

Parametreler

Prop

Type

Dönüş değeri

boolean: para alındığında true. Bakiye çok düşükse (ve negatif bakiyelere izin verilmiyorsa), meslek ya da çete veya hesap yoksa ya da amount 0’ın üstünde bir tam sayı değilse false.

Örnek

import { onClientCallback, online, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");

// Bir meslek kendi hesabından malzeme sipariş eder.
onClientCallback("myscript:orderSupplies", { lock: true }, (source) => {
  const job = online.dutyJob(source);
  if (!job) return fail("NOT_ON_DUTY");
  if (!core.RemoveSharedMoney("job", job, "bank", 1500, "supplies")) return fail("SOCIETY_NO_MONEY");
  return { ok: true };
});

TransferMoney

Parayı bir hesaptan diğerine iki defter satırıyla birlikte tek bir veritabanı transaction’ında taşır. Her taraf yüklü bir oyuncunun hesabı ya da bir mesleğin veya çetenin hesabı olabilir. İki hesap arasındaki her ödeme için kullan: bir oyuncunun bir işletmeye ödemesi, bir banka transferi, şirkete bir yatırma.

Taraf: Server · Bekler: hayır · Lib: money.transfer

İmza
TransferMoney(from: MoneyRef, to: MoneyRef, amount: number, reason?: string, fee?: number): boolean
Lua
local ok = exports['ai-core']:TransferMoney(
  { source = source, account = 'bank' },
  { owner = 'job', id = 'mechanic', account = 'bank' },
  750, 'repair', 0)

Parametreler

Prop

Type

MoneyRef, yüklü bir oyuncunun hesabı için { source, account }, bir mesleğin ya da çetenin hesabı için { owner, id, account }’tur. Bkz. MoneyRef.

Dönüş değeri

boolean: from amount + fee ödediğinde ve to amount aldığında true. Bir hesap eksikse (oyuncu yüklü değil, bilinmeyen meslek, bilinmeyen hesap tipi), iki taraf aynı hesapsa, from amount + fee ödeyemiyorsa, amount 0’ın üstünde bir tam sayı değilse ya da fee 0 ya da daha büyük bir tam sayı değilse false. false durumunda hiçbir şey değişmemiştir.

Örnek

import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail, readInt } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");

// Oyuncunun kendi çete hesabına %2 ücretle bir ATM yatırması.
onClientCallback(
  "myscript:gangDeposit",
  { args: ([amount]) => { const n = readInt(amount, 1, 1_000_000); return n === null ? null : [n]; }, lock: true },
  (source, amount) => {
    const gang = core.GetActiveGang(source);
    if (!gang) return fail("NO_GANG");
    const fee = Math.ceil(amount * 0.02);
    const ok = core.TransferMoney(
      { source, account: "bank" },
      { owner: "gang", id: gang, account: "bank" },
      amount, "gang_deposit", fee,
    );
    return ok ? { ok: true } : fail("NOT_ENOUGH_MONEY");
  },
);

İki taraf da her zamanki değişikliğini tetikler (oyuncu tarafı ai-core:moneyChanged tetikler). İki taraf iki oyuncu olabilir: { source: a, account: "bank" }’tan { source: b, account: "bank" }’a.

GetAccountTypes

Panelin Accounts listesindeki her hesap tipi; etiketi, başlangıç miktarı ve negatife düşüp düşemeyeceğiyle. Bir hesap menüsü kurmak ya da bir adı kontrol etmek için kullan.

Taraf: Server · Bekler: hayır · Lib: yok

İmza
GetAccountTypes(): Record<string, AccountTypeDefinition>
Lua
local types = exports['ai-core']:GetAccountTypes() -- hesap adına göre anahtarlanmış tablo

Parametreler

Yok.

Dönüş değeri

Record<string, AccountTypeDefinition>: hesap adına göre anahtarlanmış bir kopya (cash, bank...). Her değerin label’ı (oyunculara gösterilir), start’ı (yeni bir karakterin aldığı) ve allowNegative’i vardır. Bkz. AccountTypeDefinition.

Örnek

import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";

const core = resourceExport("ai-core");

// Cüzdan ekranı her hesabı etiketi ve bakiyesiyle listeler.
onClientCallback("myscript:wallet", (source) => {
  const rows = Object.entries(core.GetAccountTypes()).map(([name, type]) => ({
    name,
    label: type.label,
    balance: core.GetMoney(source, name) ?? 0,
  }));
  return { ok: true, rows };
});

Bu sayfada