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
InventoryRefile 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 danull. - 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
AddItem(inv: InventoryRef, item: string, count?: number, metadata?: ItemMetadata, slot?: number): booleanlocal 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
RemoveItem(inv: InventoryRef, item: string, count?: number, metadata?: ItemMetadata, slot?: number): booleanlocal 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
GetItemCount(inv: InventoryRef, item: string, metadata?: ItemMetadata): numberlocal 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
HasItem(inv: InventoryRef, item: string, count?: number): booleanlocal 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
CanCarryItem(inv: InventoryRef, item: string, count?: number, metadata?: ItemMetadata): booleanlocal 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
GetItems(inv: InventoryRef): InventoryStack[]local stacks = exports['ai-core']:GetItems(source) -- tablo listesiParametreler
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
ClearInventory(inv: InventoryRef): voidexports['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
RegisterStash(name: string, label: string, slots: number, maxWeight: number, jobs?: string[]): voidexports['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
OpenInventory(source: number, inv: InventoryRef): booleanlocal 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
RegisterShop(name: string, label: string, items: ShopProduct[]): voidexports['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
OpenShop(source: number, name: string): booleanlocal 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
RegisterUsableItem(name: string, handler: UsableItemHandler): void
// UsableItemHandler = (source: number, item: UsedItem) => unknownexports['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
GetItemDefinition(name: string): ItemDefinition | nulllocal def = exports['ai-core']:GetItemDefinition('water') -- tablo ya da nilParametreler
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
GetItemDefinitions(): Record<string, ItemDefinition>local items = exports['ai-core']:GetItemDefinitions() -- eşya adına göre anahtarlanmış tabloParametreler
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
GetInventoryWeight(source: number): { weight: number; maxWeight: number } | nulllocal w = exports['ai-core']:GetInventoryWeight(source) -- { weight, maxWeight } ya da nilParametreler
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ü)
UseItem(source: number, name: string, item?: unknown): unknownlocal 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ü)
IsUsableItem(name: string): booleanlocal 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);
}