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ı,
NaNya 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ğinreason’ı 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
GetMoney(src: number, account: string): number | nulllocal balance = exports['ai-core']:GetMoney(source, 'bank') -- sayı ya da nilParametreler
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
AddMoney(src: number, account: string, amount: number, reason?: string): booleanlocal 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
RemoveMoney(src: number, account: string, amount: number, reason?: string): booleanlocal 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
SetMoney(src: number, account: string, amount: number, reason?: string): booleanlocal 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)
GetSharedMoney(ownerType: "job" | "gang", ownerId: string, account: string): number | nulllocal balance = exports['ai-core']:GetSharedMoney('job', 'police', 'bank') -- sayı ya da nilParametreler
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
AddSharedMoney(
ownerType: "job" | "gang",
ownerId: string,
account: string,
amount: number,
reason?: string,
): booleanlocal 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
RemoveSharedMoney(
ownerType: "job" | "gang",
ownerId: string,
account: string,
amount: number,
reason?: string,
): booleanlocal 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
TransferMoney(from: MoneyRef, to: MoneyRef, amount: number, reason?: string, fee?: number): booleanlocal 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
GetAccountTypes(): Record<string, AccountTypeDefinition>local types = exports['ai-core']:GetAccountTypes() -- hesap adına göre anahtarlanmış tabloParametreler
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 };
});Karakterler ve oyuncular
Yüklü bir oyuncunun verisini ve karakterini oku, karakter id’si ya da citizen id ile bir oyuncu bul, karakter değiştir, çevrimdışı bir karakteri taşı, kapsamdaki oyuncular.
Meslekler ve çeteler
Bir karakterin mesleklerini, çetelerini, rütbelerini ve mesaisini oku ve değiştir, mesaideki oyuncuları say, prime time, meslek ve çete tanımlarını oku.