Ortak arayüz
notify, progress, menu, input, istemler, skillCheck, lockpick ve itemPicker - ai-lib’in her resource için çizdiği oyuncu arayüzü.
ai-lib her resource için tek bir ortak arayüz çizer: bildirim kartları, ilerleme çubuğu, "E’ye bas" istemleri (prompt), menüler, giriş pencereleri ve minigame’ler. Script’in yalnızca bunları ister; böylece sunucudaki her script aynı görünür ve bunlar için hiç NUI yazmazsın. Eşya seçiciyi ai-core çizer.
Verdiğin metinler olduğu gibi gösterilir: önce onları çevir (TypeScript’te Locale("KEY"), Lua’da t('KEY')).
Bildirimler
notify
Bu oyuncunun ekranında bir bildirim kartı gösterir.
Taraf: Client · Bekler: hayır
notify(text: string, kind?: NotificationKind, duration?: number): voidaiLib.notify(text, kind, duration)Parametreler
Prop
Type
Tür tipi NotificationKind’dır. Bir oyuncuya server’dan bildirim göndermek için server’daki notify(source, text, kind)’ı kullan.
Dönüş değeri
void.
Örnek
import { createLocale, notify } from "@aicore-fivem/lib/client";
const Locale = createLocale<typeof import("../../locales/en.json")>();
notify(Locale("WELCOME"));
notify(Locale("NO_MONEY"), "error");
notify(Locale("SAVED"), "success", 2000);İlerleme çubuğu
progress
ai-lib’in ilerleme çubuğuyla ve isteğe bağlı bir animasyon ya da senaryoyla zamanlı bir aksiyon çalıştırır ve bitene kadar bekler. Oyuncu öldüğünde, bir araca bindiğinde, ai-lib’in iptal tuşuna bastığında (varsayılan Backspace, yalnızca canCancel ile) ya da script’in cancelProgress() çağırdığında erken biter (iptal edilir). Resource başına aynı anda bir ilerleme.
Taraf: Client · Bekler: evet (TypeScript’te Promise, Lua’da thread’i yield eder)
progress(options: ProgressOptions): Promise<boolean>local finished = aiLib.progress(options) -- boolean, bir thread içinde çağırParametreler
Prop
Type
ProgressOptions
Prop
Type
Dönüş değeri
Promise<boolean>: çubuk bittiyse true; iptal edildiyse ya da resource’unun başka bir ilerlemesi hâlâ çalışıyorsa hemen false. Lua aynı boolean’ı döndürür.
Örnek
import { callAction, createLocale, nearestVehicle, notify, progress } from "@aicore-fivem/lib/client";
const Locale = createLocale<typeof import("../../locales/en.json")>();
export async function repair(): Promise<void> {
const vehicle = nearestVehicle(4, { notOwn: true });
if (!vehicle) return notify(Locale("NO_VEHICLE"), "error");
const [x = 0, y = 0, z = 0] = GetEntityCoords(vehicle, false);
const done = await progress({
label: Locale("REPAIRING"),
duration: 8000,
face: { x, y, z },
anim: { dict: "mini@repair", clip: "fixing_a_player" },
canCancel: true,
disable: { move: true, combat: true },
});
if (!done) return notify(Locale("CANCELLED"), "error");
await callAction("mymech:repair", [NetworkGetNetworkIdFromEntity(vehicle)], { fallback: "REPAIR_FAILED" });
}Sonuç client’ın sözüdür: bir hileci çubuğu atlayabilir. Aksiyonun karşılığını server ödüyorsa (eşyalar, para, bir tamir), çubuğu server’dan progressFor(source, options) ile çalıştır (Client girdisi): yalnızca server’da da yeterli zaman geçtiyse true cevabını verir.
cancelProgress
Oyuncu iptal edebilsin ya da etmesin, resource’unun çalışan ilerlemesini iptal eder. progress çağrısı bunun üzerine false ile çözülür. Hiçbir ilerleme çalışmıyorsa hiçbir şey olmaz.
Taraf: Client · Bekler: hayır
cancelProgress(): voidaiLib.progress.cancel()Dönüş değeri
void.
Örnek
import { cancelProgress, onServerEvent } from "@aicore-fivem/lib/client";
// Server hedefin başka biri tarafından soyulduğunu söyler.
onServerEvent("myrob:taken", () => cancelProgress());isProgressRunning
Resource’unun bir ilerlemesinin şu an çalışıp çalışmadığı.
Taraf: Client · Bekler: hayır
isProgressRunning(): booleanlocal running = aiLib.progress.isRunning()Dönüş değeri
boolean: resource’unun çubuğu çalışırken true. Diğer resource’ların çubukları sayılmaz.
Örnek
import { isProgressRunning, menu } from "@aicore-fivem/lib/client";
export async function openMenu(): Promise<void> {
if (isProgressRunning()) return; // meşgul
await menu({ title: "Actions", items: [{ id: "a", label: "Action" }] });
}Menüler ve pencereler
menu
ai-lib’in menüsünü gösterir ve oyuncunun seçimini bekler. Ok tuşları gezinir, Enter seçer. checked olan öğeler, menüyü kapatmadan yerinde değişen anahtar satırlarıdır. Bir alt menüde (back: true) kısa bir Escape MENU_BACK ile çözülür, böylece önceki menüyü açabilirsin; Escape’e basılı tutmak kapatır.
Taraf: Client · Bekler: evet (TypeScript’te Promise, Lua’da thread’i yield eder)
menu(request: MenuRequest, listeners?: ((item: string) => void) | MenuListeners): Promise<string | null>local picked = aiLib.menu.show(request, listeners) -- string ya da nil, bir thread içinde çağırParametreler
Prop
Type
MenuRequest
Prop
Type
MenuItem
Prop
Type
Tipler MenuRequest ve MenuItem’dır.
MenuListeners
Prop
Type
Dönüş değeri
Promise<string | null>: seçilen öğe id’si; bir alt menüde kısa bir Escape’ten sonra "__back" (@aicore-fivem/shared’dan MENU_BACK); oyuncu menüyü kapattıysa null. Lua aynısını döndürür, kapatma için nil.
Örnek
import { callAction, createLocale, menu } from "@aicore-fivem/lib/client";
import { MENU_BACK } from "@aicore-fivem/shared";
const Locale = createLocale<typeof import("../../locales/en.json")>();
let engineOn = true;
export async function vehicleMenu(vehicle: number): Promise<void> {
const pick = await menu({
title: Locale("VEHICLE"),
items: [
{ id: "doors", label: Locale("DOORS"), icon: "door-open" },
{ id: "engine", label: Locale("ENGINE"), icon: "power-off", checked: engineOn },
],
}, {
onToggle: (item, checked) => {
if (item !== "engine") return;
engineOn = checked;
SetVehicleEngineOn(vehicle, checked, false, true);
},
});
if (pick === "doors") await doorsMenu(vehicle);
}
async function doorsMenu(vehicle: number): Promise<void> {
const pick = await menu({
title: Locale("DOORS"),
back: true,
items: [0, 1, 2, 3].map((door) => ({ id: String(door), label: Locale("DOOR", door + 1) })),
});
if (pick === MENU_BACK) return vehicleMenu(vehicle);
if (pick !== null) SetVehicleDoorOpen(vehicle, Number(pick), false, false);
}Seçilen id oyuncunun client’ından gelir: server bunun geçerli bir seçim olduğunu kontrol etmelidir.
input
ai-lib’in giriş penceresini gösterir ve değerleri bekler. Her alan bir sayı kutusu ya da bir metin kutusudur.
Taraf: Client · Bekler: evet (TypeScript’te Promise, Lua’da thread’i yield eder)
input(request: InputRequest): Promise<Record<string, string | number> | null>local values = aiLib.input(request) -- table ya da nil, bir thread içinde çağırParametreler
Prop
Type
InputRequest
Prop
Type
InputField: number
Prop
Type
InputField: text
Prop
Type
Tipler InputRequest ve InputField’dır.
Dönüş değeri
Promise<Record<string, string | number> | null>: oyuncu onayladıysa alan name’ine göre girilen değerler; pencereyi kapattıysa null. Ne string ne de sayı olan değerler dışarıda bırakılır. Lua tabloyu ya da nil döndürür.
Örnek
import { callAction, createLocale, input } from "@aicore-fivem/lib/client";
const Locale = createLocale<typeof import("../../locales/en.json")>();
export async function sendBill(target: number): Promise<void> {
const values = await input({
title: Locale("BILL"),
confirm: Locale("SEND"),
fields: [
{ name: "amount", label: Locale("AMOUNT"), type: "number", min: 1, max: 100000 },
{ name: "reason", label: Locale("REASON"), type: "text", maxLength: 80 },
],
});
if (!values) return;
await callAction("mybill:send", [target, values.amount, values.reason], { fallback: "BILL_FAILED" });
}min, max ve maxLength yalnızca oyuncuya yol gösterir. Server her değeri tekrar kontrol etmelidir (server handler’ında readInt, readText).
itemPicker
Admin araçları: ai-core’un eşya seçicisini gösterir. Aktif envanterin her eşyasını resmi ve bir aramayla listeler; tıklamalar sağdaki bir listeyi doldurur (tıklama başına 1, Ctrl ile 10, Shift ile 100) ve liste hedefin ağırlık sınırında durur. Eşya listesi yalnızca admin’lere gönderilir.
Taraf: Client · Bekler: evet (TypeScript’te Promise, Lua’da thread’i yield eder)
itemPicker(request: ItemPickerRequest): Promise<PickedItem[] | null>local list = aiLib.itemPicker(request) -- table ya da nil, bir thread içinde çağırParametreler
Prop
Type
ItemPickerRequest
Prop
Type
Dönüş değeri
Promise<PickedItem[] | null>: admin’in aldığı liste, her satır { name: string; count: number } (count 0’dan büyük bir tam sayı); seçici kapatıldıysa null. Lua listeyi ya da nil döndürür. Tipler ItemPickerRequest ve PickedItem’dır.
Örnek
import { callAction, itemPicker } from "@aicore-fivem/lib/client";
export async function giveItems(target: number): Promise<void> {
const list = await itemPicker({ title: "Give items", target });
if (!list || list.length === 0) return;
await callAction("myadmin:give", [target, list], { fallback: "GIVE_FAILED" });
}Eşyaları server handler’ın verir: çağıranın admin olduğunu kontrol et (isAdmin koruması) ve her adı ve miktarı tekrar kontrol et. Seçici kendi başına asla bir şey vermez.
Elle istemler
Noktalar istemleri senin için gösterir ve gizler. Bunları yalnızca bir yere bağlı olmayan bir istem için kullan.
showPrompt
Resource’unun istemlerinden birini gösterir (ya da metnini değiştirir): ekranın sağındaki "E’ye bas" kutusu. at ile istem bunun yerine bir dünya noktasının ya da bir entity noktasının üzerinde süzülür.
Taraf: Client · Bekler: hayır
showPrompt(id: string, text: string, at?: PromptAnchor): voidaiLib.showPrompt(id, text) -- Lua’da dünya çapası yokParametreler
Prop
Type
Dönüş değeri
void.
Örnek
Bkz. onPromptPressed.
hidePrompt
Resource’unun istemlerinden birini gizler. Gösterilmeyen bir id hiçbir şey yapmaz.
Taraf: Client · Bekler: hayır
hidePrompt(id: string): voidaiLib.hidePrompt(id)Parametreler
Prop
Type
Dönüş değeri
void.
onPromptPressed
Resource’unun istemlerinden biri en üstteyken oyuncu etkileşim tuşuna (varsayılan E) bastığında bir handler çalıştırır.
Taraf: Client · Bekler: hayır
onPromptPressed(handler: (id: string) => void): voidaiLib.onPromptPressed(function(id) end)Parametreler
Prop
Type
Dönüş değeri
void.
Örnek
import { createLocale, hidePrompt, onCache, onPromptPressed, showPrompt } from "@aicore-fivem/lib/client";
const Locale = createLocale<typeof import("../../locales/en.json")>();
// Yolcu koltuğunda otururken "Fırlatmak için E’ye bas".
onCache("seat", (seat) => {
if (seat === 0) showPrompt("eject", Locale("EJECT"));
else hidePrompt("eject");
});
onPromptPressed((id) => {
if (id !== "eject") return;
TaskLeaveVehicle(PlayerPedId(), GetVehiclePedIsIn(PlayerPedId(), false), 4160);
});Minigame’ler
skillCheck
ai-lib’in skill check’i: bir ibre her aşamada bir halkanın etrafında bir kez döner ve oyuncu, ibre yeşil yaydayken gösterilen tuşa basar. Yaygın FiveM skill check biçimine sahiptir ("easy" | "medium" | "hard" ya da { areaSize, speedMultiplier }); bu yüzden ox_lib’in skill check’i için yazılan kod aynı şekilde çalışır.
Taraf: Client · Bekler: evet (TypeScript’te Promise, Lua’da thread’i yield eder)
skillCheck(difficulty: SkillDifficulty | SkillDifficulty[], keys?: string[]): Promise<boolean>local passed = aiLib.skillCheck(difficulty, keys) -- boolean, bir thread içinde çağırParametreler
Prop
Type
SkillDifficulty
SkillDifficulty şunlardan biridir:
Prop
Type
Dönüş değeri
Promise<boolean>: her aşama tutturulduysa true; bir ıskalamada, yanlış bir tuşta ya da Escape’te false.
Örnek
import { callAction, skillCheck } from "@aicore-fivem/lib/client";
export async function hotwire(netId: number): Promise<void> {
const passed = await skillCheck(["easy", "easy", "medium", { areaSize: 30, speedMultiplier: 1.5 }], ["w", "a", "s", "d"]);
await callAction("mykeys:hotwire", [netId, passed], { fallback: "HOTWIRE_FAILED" });
}Sonuç client’ın sözüdür. Minigame karşılığında bir şey kazandırıyorsa (bir araba, bir soygun), onu server’dan minigameFor(source, { game: "skillCheck", ... }) ile oynat; bu ayrıca gerçek bir oynanıştan hızlı bir kazanmayı da reddeder (Client girdisi).
lockpick
ai-lib’in maymuncuğu: oyuncu maymuncuğu A / D (ya da oklar) ile hareket ettirir ve kilidi çevirmek için W’ye basılı tutar. Maymuncuk gizli doğru noktaya ne kadar yakınsa kilit o kadar fazla döner; zorlamak maymuncuğu yıpratır.
Taraf: Client · Bekler: evet (TypeScript’te Promise, Lua’da thread’i yield eder)
lockpick(options?: LockpickOptions): Promise<LockpickResult>local result = aiLib.lockpick(options) -- 'opened' | 'broken' | 'cancelled', bir thread içinde çağırParametreler
Prop
Type
LockpickOptions
Prop
Type
Dönüş değeri
Promise<LockpickResult> (LockpickResult): her pim döndüyse "opened"; son maymuncuk kırıldıysa "broken" (maymuncuk eşyasını al); oyuncu Escape’e bastıysa "cancelled".
Örnek
import { callAction, lockpick } from "@aicore-fivem/lib/client";
export async function pickDoor(doorId: string): Promise<void> {
const result = await lockpick({ difficulty: "hard", pins: 3, picks: 2 });
if (result === "cancelled") return;
await callAction("mydoors:picked", [doorId, result], { fallback: "PICK_FAILED" });
}Ped’ler, blip’ler ve prop’lar
LocalPed, Blips, createBlip, attachProp, PreviewVehicle ve player.holdAnim - yerel NPC’ler, harita blip’leri, elde tutulan prop’lar, galeri araçları ve sürdürülen animasyonlar.
Ekranlar ve kontroller
NuiScreen, hud, keyHints ve controls - kendi tam ekran NUI’n, tüm HUD’ları gizlemek, tuş yardım satırları ve devre dışı kontroller.