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

Eşyalar

Herhangi bir envanterde eşya ekle, çıkar, say ve kontrol et; stash’ler, script dükkanları ve kullanılabilir eşyalar kaydet; eşya tanımlarını ve taşınan ağırlığı oku.

Her eşya çağrısı ai-core üzerinden gider, asla bir envanter script’inin kendi export’ları üzerinden değil. ai-core her çağrıyı aktif envantere iletir: panelin Inventory script ayarının seçtiği ya da otomatik ayarlıyken çalışan ilk envanter (ai-inventory, ox_inventory, qb-inventory, tgiann-inventory ve uyumluluk listesindeki diğerleri). Sunucu sahibi envanteri değiştirdiğinde script’in hiç değişmeden çalışmaya devam eder.

Bilmen gerekenler:

  • Bir envanter bir InventoryRef ile adlandırılır: o oyuncunun cepleri için oyuncunun server id’si (bir sayı), başka her şey için bir metin id (bir stash adı, bir bagaj plakası). Bkz. InventoryRef.
  • Eşya adları envanterin eşya adlarıdır (water, bandage, WEAPON_PISTOL).
  • Metadata tek bir yığındaki ek değerlerin tablosudur (seri numarası, dayanıklılık). Bkz. ItemMetadata.
  • Hiçbir envanter çalışmıyorken her çağrı kendi "hiçbir şey" değerini döndürür: false, 0, boş bir liste ya da null.
  • Kaydettiğin stash’ler, dükkanlar ve kullanılabilir eşyalar ai-core tarafından tutulur ve sonradan aktif olan her envantere, bir envanter yeniden başladıktan sonra da verilir. Onları script’in başladığında bir kez kaydet.

AddItem

Bir envantere eşya verir.

Taraf: Server · Bekler: hayır · Lib: inventory.addItem

İmza
AddItem(inv: InventoryRef, item: string, count?: number, metadata?: ItemMetadata, slot?: number): boolean
Lua
local ok = exports['ai-core']:AddItem(source, 'water', 2)

Parametreler

Prop

Type

Dönüş değeri

boolean: envanter eşyaları eklediğinde true. Sığmıyorlarsa, eşya envanterde yoksa, bir argüman yanlışsa (count 1’in altında, boş eşya adı) ya da hiçbir envanter çalışmıyorsa false.

Örnek

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

const core = resourceExport("ai-core");
const TAP = { x: 1206.4, y: -3110.2, z: 5.6 };

onClientCallback("myscript:fillBottle", { guards: [near(TAP, 2)], lock: true }, (source) => {
  if (!core.RemoveItem(source, "empty_bottle")) return fail("NO_BOTTLE");
  if (!core.AddItem(source, "water")) {
    core.AddItem(source, "empty_bottle");
    return fail("NO_SPACE");
  }
  return { ok: true };
});

RemoveItem

Bir envanterden eşya alır.

Taraf: Server · Bekler: hayır · Lib: inventory.removeItem

İmza
RemoveItem(inv: InventoryRef, item: string, count?: number, metadata?: ItemMetadata, slot?: number): boolean
Lua
local ok = exports['ai-core']:RemoveItem(source, 'lockpick', 1)

Parametreler

Prop

Type

Dönüş değeri

boolean: eşyalar alındığında true. Envanterde daha az varsa (o zaman hiçbiri alınmaz), bir argüman yanlışsa ya da hiçbir envanter çalışmıyorsa false.

Örnek

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

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

onClientCallback("myscript:pickLock", { lock: true }, async (source) => {
  if (!core.HasItem(source, "lockpick")) return fail("NO_LOCKPICK");
  const result = await minigameFor(source, { game: "lockpick", minMs: 1500 });
  if (result === "broken") core.RemoveItem(source, "lockpick");
  return result === "won" ? { ok: true } : fail("LOCKPICK_FAILED");
});

GetItemCount

Bir envanterde bir eşyadan kaç tane olduğu.

Taraf: Server · Bekler: hayır · Lib: inventory.getItemCount

İmza
GetItemCount(inv: InventoryRef, item: string, metadata?: ItemMetadata): number
Lua
local count = exports['ai-core']:GetItemCount(source, 'fish')

Parametreler

Prop

Type

Dönüş değeri

number: tüm yığınların toplamı. Hiç yoksa, bir argüman yanlışsa ya da hiçbir envanter çalışmıyorsa 0.

Örnek

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

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

// Balık alıcısı oyuncunun ne kadar alacağını gösterir.
onClientCallback("myscript:fishQuote", (source) => ({
  ok: true,
  price: core.GetItemCount(source, "fish") * 25,
}));

HasItem

Bir envanterde bir eşyadan en az belli sayıda olup olmadığı.

Taraf: Server · Bekler: hayır · Lib: inventory.hasItem

İmza
HasItem(inv: InventoryRef, item: string, count?: number): boolean
Lua
local has = exports['ai-core']:HasItem(source, 'repairkit')

Parametreler

Prop

Type

Dönüş değeri

boolean: envanterde count ya da daha fazla varsa true. Daha az varsa, count 1’in altındaysa ya da hiçbir envanter çalışmıyorsa false.

Örnek

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

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

onClientCallback("myscript:repair", { lock: true }, async (source) => {
  if (!core.HasItem(source, "repairkit")) return fail("NO_KIT");
  if (!(await progressFor(source, { label: Locale("REPAIRING"), duration: 8000 }))) return fail("CANCELLED");
  if (!core.RemoveItem(source, "repairkit")) return fail("NO_KIT");
  return { ok: true };
});

Bekleyen her şeyden sonra (bir ilerleme çubuğu, bir mini oyun) RemoveItem’ın cevabıyla tekrar kontrol et: oyuncu bu arada eşyayı bırakmış olabilir.

CanCarryItem

Eşyaların eklenmeden bir envantere sığıp sığmayacağı (ağırlık ve slotlar).

Taraf: Server · Bekler: hayır · Lib: inventory.canCarryItem

İmza
CanCarryItem(inv: InventoryRef, item: string, count?: number, metadata?: ItemMetadata): boolean
Lua
local fits = exports['ai-core']:CanCarryItem(source, 'water', 5)

Parametreler

Prop

Type

Dönüş değeri

boolean: sığıyorlarsa true. Sığmıyorlarsa, bir argüman yanlışsa ya da hiçbir envanter çalışmıyorsa false.

Örnek

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

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

onClientCallback("myscript:buyWater", { lock: true }, (source) => {
  if (!core.CanCarryItem(source, "water", 5)) return fail("NO_SPACE");
  if (!core.RemoveMoney(source, "cash", 50, "shop_water")) return fail("NOT_ENOUGH_MONEY");
  core.AddItem(source, "water", 5);
  return { ok: true };
});

GetItems

Bir envanterdeki her yığın, etiketleriyle.

Taraf: Server · Bekler: hayır · Lib: inventory.getItems

İmza
GetItems(inv: InventoryRef): InventoryStack[]
Lua
local stacks = exports['ai-core']:GetItems(source) -- tablo listesi

Parametreler

Prop

Type

Dönüş değeri

InventoryStack[]: yığın başına name, label, count, slot ve metadata içeren bir kayıt. Bkz. InventoryStack. Boş ya da bilinmeyen bir envanter, yanlış bir argüman ya da çalışan envanter yokken boş liste.

Örnek

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

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

// Bir rehinci, oyuncunun taşıdığı ve kendisinin satın aldığı her eşyayı listeler.
const BUYS: Record<string, number> = { gold_ring: 120, rolex: 400 };

onClientCallback("myscript:pawnList", (source) => ({
  ok: true,
  rows: core.GetItems(source)
    .filter((stack) => BUYS[stack.name] !== undefined)
    .map((stack) => ({ slot: stack.slot, label: stack.label, count: stack.count, price: BUYS[stack.name] })),
}));

ClearInventory

Bir envanteri tamamen boşaltır.

Taraf: Server · Bekler: hayır · Lib: inventory.clearInventory

İmza
ClearInventory(inv: InventoryRef): void
Lua
exports['ai-core']:ClearInventory(source)

Parametreler

Prop

Type

Dönüş değeri

Hiçbir şey. Yanlış bir argüman ya da çalışan envanter yoksa hiçbir şey yapmaz.

Örnek

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

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

addCommand("clearinv", { help: "Empties a player inventory", params: [{ name: "id", type: "playerId" }], restricted: true }, (_source, args) => {
  core.ClearInventory(args.id);
});

Bu geri alınamaz. Bir admin komutunun ya da açık bir oyun kuralının arkasında tut (eşyaları önce saklayan bir hapishane girişi).

RegisterStash

Bir stash oluşturur: oyuncuların adıyla açtığı bir depolama kutusu. ai-core onu tutar ve aktif olan her envantere yeniden kaydeder.

Taraf: Server · Bekler: hayır · Lib: inventory.registerStash

İmza
RegisterStash(name: string, label: string, slots: number, maxWeight: number, jobs?: string[]): void
Lua
exports['ai-core']:RegisterStash('police_evidence', 'Evidence', 100, 500000, { 'police' })

Parametreler

Prop

Type

Bir değer eksik ya da yanlış olduğunda varsayılanlar uygulanır.

Dönüş değeri

Hiçbir şey. Metin bir name olmadan çağrı hiçbir şey yapmaz. Aynı adı tekrar kaydetmek stash’i değiştirir.

Örnek

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

const core = resourceExport("ai-core");
const LOCKER = { x: 474.9, y: -994.7, z: 26.3 };

// Açılışta bir kez; ai-core onu sonradan başlayan envanterlere verir.
core.RegisterStash("police_evidence", Locale("STASH_EVIDENCE"), 100, 500_000, ["police"]);

onClientCallback("myscript:openEvidence", { guards: [near(LOCKER, 2)] }, (source) => {
  if (core.GetDutyJob(source) !== "police") return fail("NOT_POLICE");
  return core.OpenInventory(source, "police_evidence") ? { ok: true } : fail("STASH_FAILED");
});

OpenInventory

Bir oyuncunun ekranında, kendi envanterinin yanında bir stash, bir bagaj ya da başka bir oyuncunun envanterini açar.

Taraf: Server · Bekler: hayır · Lib: inventory.openInventory

İmza
OpenInventory(source: number, inv: InventoryRef): boolean
Lua
local opened = exports['ai-core']:OpenInventory(source, 'police_evidence')

Parametreler

Prop

Type

Dönüş değeri

boolean: envanter ekranı açtığında true. Açamadığında (bilinmeyen stash, oyuncunun envanteri yok), bir argüman yanlışsa ya da hiçbir envanter çalışmıyorsa false.

Örnek

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

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

// Polis yanında duran kelepçeli bir oyuncuyu arar.
onClientCallback("myscript:search", { args: oneArg(readId) }, (source, target) => {
  if (core.GetDutyJob(source) !== "police") return fail("NOT_POLICE");
  if (target === source || !isNear(target, coordsOf(source), 2)) return fail("TOO_FAR");
  return core.OpenInventory(source, target) ? { ok: true } : fail("SEARCH_FAILED");
});

Envanter burada mesafe ya da yetki kontrolü yapmaz. Çağırmadan önce mesleği, mesafeyi ve hedefin durumunu kendin kontrol et.

RegisterShop

Bir script dükkanı oluşturur: script’inin bir oyuncu için açtığı fiyatlı bir eşya listesi (bir cephanelik, bir otomat). Envanter dükkanı çizer ve ödemeyi kendi yöntemiyle alır (önce nakit, sonra banka). ai-core onu tutar ve aktif olan her envantere verir.

Taraf: Server · Bekler: hayır · Lib: inventory.registerShop

İmza
RegisterShop(name: string, label: string, items: ShopProduct[]): void
Lua
exports['ai-core']:RegisterShop('police_armoury', 'Armoury', { { name = 'bandage', price = 0 } })

Parametreler

Prop

Type

Bkz. ShopProduct.

Dönüş değeri

Hiçbir şey. Metin bir name olmadan ya da geçerli ürün olmadan çağrı hiçbir şey yapmaz. Aynı adı tekrar kaydetmek dükkanı değiştirir.

Örnek

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

const core = resourceExport("ai-core");
const ARMOURY = { x: 482.6, y: -995.2, z: 30.7 };

core.RegisterShop("police_armoury", Locale("SHOP_ARMOURY"), [
  { name: "WEAPON_STUNGUN", price: 0 },
  { name: "bandage", price: 10 },
]);

onClientCallback("myscript:armoury", { guards: [near(ARMOURY, 2)] }, (source) => {
  if (core.GetDutyJob(source) !== "police") return fail("NOT_POLICE");
  return core.OpenShop(source, "police_armoury") ? { ok: true } : fail("SHOP_FAILED");
});

OpenShop

RegisterShop ile kaydedilmiş bir dükkanı bir oyuncunun ekranında açar.

Taraf: Server · Bekler: hayır · Lib: inventory.openShop

İmza
OpenShop(source: number, name: string): boolean
Lua
local opened = exports['ai-core']:OpenShop(source, 'police_armoury')

Parametreler

Prop

Type

Dönüş değeri

boolean: dükkan açıldığında true. O adda dükkan yoksa, aktif envanterin script dükkanları yoksa, açamadıysa ya da hiçbir envanter çalışmıyorsa false.

Örnek

Yukarıdaki RegisterShop örneğine bak: açılışta bir kez kaydet, sonra kendi meslek ve mesafe kontrollerinden sonra aç.

OpenInventory gibi bu da mesafe ya da erişim kontrolü yapmaz. Önce onları kontrol et.

RegisterUsableItem

Bir eşyayı kullanılabilir yapar: bir oyuncu onu envanterde kullandığında fonksiyonun çalışır. ai-core fonksiyonu tutar, böylece sonradan başlayan envanterlerle çalışır ve bir envanter yeniden başlamasından sağ çıkar.

Taraf: Server · Bekler: hayır · Lib: inventory.registerUsableItem

İmza
RegisterUsableItem(name: string, handler: UsableItemHandler): void
// UsableItemHandler = (source: number, item: UsedItem) => unknown
Lua
exports['ai-core']:RegisterUsableItem('bandage', function(source, item) end)

Parametreler

Prop

Type

Bkz. UsableItemHandler ve UsedItem.

Dönüş değeri

Hiçbir şey. Metin bir name ya da bir fonksiyon olmadan çağrı hiçbir şey yapmaz. Aynı eşya için ikinci bir çağrı handler’ı değiştirir.

Kullanımdan sonra eşyaya ne olacağı envantere bağlıdır: kullanılan eşyayı kendisi alan envanterler (ai-inventory eşyanın consume miktarını alır) handler’ın false döndürdüğünde onu tutar; diğer envanterler kendi eşya ayarlarına uyar, bu yüzden orada gerektiğinde eşyayı kendin çıkar.

Örnek

import { progressFor, resourceExport } from "@aicore-fivem/lib/server";
import { Locale } from "common";

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

core.RegisterUsableItem("bandage", (source) => {
  // Handler hemen cevap vermelidir; zamanlı kısım kendi başına çalışır.
  void (async () => {
    if (!(await progressFor(source, { label: Locale("BANDAGING"), duration: 4000 }))) return;
    if (!core.RemoveItem(source, "bandage")) return;
    emitNet("myscript:client:heal", source, 25); // client script’in canı ekler
  })();
  return false; // yerinde tut: çubuk bittiğinde yukarıda çıkarılır
});

Bir kullanım ayrıca açlık ve susuzluk gibi eşya etkilerinin izlediği ai-core:itemUsed (src, name, status) server event’ini tetikler. Bkz. Event’ler ve durum.

GetItemDefinition

Aktif envanterin tanımladığı haliyle tek bir eşya: etiket, ağırlık, yığılıp yığılmadığı, resim.

Taraf: Server · Bekler: hayır · Lib: inventory.getItemDefinition

İmza
GetItemDefinition(name: string): ItemDefinition | null
Lua
local def = exports['ai-core']:GetItemDefinition('water') -- tablo ya da nil

Parametreler

Prop

Type

Dönüş değeri

ItemDefinition | null: name, label, weight, unique, close, description ve envanterde varsa image içeren eşya. Bkz. ItemDefinition. Bilinmeyen bir eşya, boş bir ad ya da çalışan envanter yokken null.

Örnek

import { notify, resourceExport } from "@aicore-fivem/lib/server";
import { Locale } from "common";

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

/** Envanterin kendi etiketiyle "2x Water aldın". */
export function giveWithNotice(source: number, item: string, count: number): void {
  if (!core.AddItem(source, item, count)) return;
  const label = core.GetItemDefinition(item)?.label ?? item;
  notify(source, Locale("NOTIFY_RECEIVED", count, label), "success");
}

GetItemDefinitions

Aktif envanterin tanımladığı her eşya, ada göre anahtarlanmış. Seyrek kullan (bir listeyi bir kez kurmak); tek bir eşya için GetItemDefinition kullan.

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

İmza
GetItemDefinitions(): Record<string, ItemDefinition>
Lua
local items = exports['ai-core']:GetItemDefinitions() -- eşya adına göre anahtarlanmış tablo

Parametreler

Yok.

Dönüş değeri

Record<string, ItemDefinition>: her eşya. Hiçbir envanter çalışmıyorken boş tablo.

Örnek

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

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

/** Açılışta config’indeki envanterin tanımadığı eşyalar hakkında uyarır. */
export function checkItems(names: string[]): void {
  const known = core.GetItemDefinitions();
  for (const name of names) if (!known[name]) console.log(`unknown item: ${name}`);
}

Böyle bir kontrolü envanter başladıktan sonra çalıştır: sunucu başlar başlamaz envanter henüz çalışmıyor olabilir ve tablo boş olur.

GetInventoryWeight

Bir oyuncunun ağırlık olarak ne taşıdığı ve ne taşıyabileceği.

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

İmza
GetInventoryWeight(source: number): { weight: number; maxWeight: number } | null
Lua
local w = exports['ai-core']:GetInventoryWeight(source) -- { weight, maxWeight } ya da nil

Parametreler

Prop

Type

Dönüş değeri

{ weight, maxWeight } | null: taşınan ağırlık ve sınır, gram cinsinden. Aktif envanter bunları söylemiyorsa, oyuncunun yüklü envanteri yoksa ya da hiçbir envanter çalışmıyorsa null.

Örnek

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

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

onClientCallback("myscript:weight", (source) => {
  const w = core.GetInventoryWeight(source);
  return { ok: true, free: w ? w.maxWeight - w.weight : null };
});

UseItem

Bir eşya için kaydedilmiş handler’ı, oyuncu onu kullanmış gibi çalıştırır. ai-core’un ESX / QB köprüsü bunu çağırır (ESX.UseItem ve QB’nin CanUseItem’ından); normal bir script’in bunu yapması için bir sebep yoktur.

Taraf: Server · Bekler: hayır · Lib: yok (yalnızca köprü)

İmza
UseItem(source: number, name: string, item?: unknown): unknown
Lua
local result = exports['ai-core']:UseItem(source, 'bandage', stack)

Parametreler

Prop

Type

Dönüş değeri

unknown: handler’ın döndürdüğü. Kayıtlı handler yoksa, argümanlar yanlışsa ya da handler hata fırlattıysa (loglanır) false.

Örnek

Örnek yok: envanterler ve köprü bunu çağırır. Bir kullanıma tepki vermek için eşyayı RegisterUsableItem ile kaydet.

IsUsableItem

Bir eşya için handler kayıtlı olup olmadığı. ai-core’un köprüsü bunu kullanır.

Taraf: Server · Bekler: hayır · Lib: yok (yalnızca köprü)

İmza
IsUsableItem(name: string): boolean
Lua
local usable = exports['ai-core']:IsUsableItem('bandage')

Parametreler

Prop

Type

Dönüş değeri

boolean: bir resource eşyayı RegisterUsableItem ile kaydettiyse true. Aksi halde false.

Örnek

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

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

/** Eşya ipuçları "Kullan"ı yalnızca kullanılabilir eşyalar için gösterir. */
export function canUse(item: string): boolean {
  return core.IsUsableItem(item);
}

Bu sayfada