AI Core
API başvurusuLib: client

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

Signature
notify(text: string, kind?: NotificationKind, duration?: number): void
Lua
aiLib.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)

Signature
progress(options: ProgressOptions): Promise<boolean>
Lua
local finished = aiLib.progress(options) -- boolean, bir thread içinde çağır

Parametreler

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

Signature
cancelProgress(): void
Lua
aiLib.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

Signature
isProgressRunning(): boolean
Lua
local 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

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)

Signature
menu(request: MenuRequest, listeners?: ((item: string) => void) | MenuListeners): Promise<string | null>
Lua
local picked = aiLib.menu.show(request, listeners) -- string ya da nil, bir thread içinde çağır

Parametreler

Prop

Type

Prop

Type

Prop

Type

Tipler MenuRequest ve MenuItem’dır.

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)

Signature
input(request: InputRequest): Promise<Record<string, string | number> | null>
Lua
local values = aiLib.input(request) -- table ya da nil, bir thread içinde çağır

Parametreler

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)

Signature
itemPicker(request: ItemPickerRequest): Promise<PickedItem[] | null>
Lua
local list = aiLib.itemPicker(request) -- table ya da nil, bir thread içinde çağır

Parametreler

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

Signature
showPrompt(id: string, text: string, at?: PromptAnchor): void
Lua
aiLib.showPrompt(id, text) -- Lua’da dünya çapası yok

Parametreler

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

Signature
hidePrompt(id: string): void
Lua
aiLib.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

Signature
onPromptPressed(handler: (id: string) => void): void
Lua
aiLib.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)

Signature
skillCheck(difficulty: SkillDifficulty | SkillDifficulty[], keys?: string[]): Promise<boolean>
Lua
local passed = aiLib.skillCheck(difficulty, keys) -- boolean, bir thread içinde çağır

Parametreler

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)

Signature
lockpick(options?: LockpickOptions): Promise<LockpickResult>
Lua
local result = aiLib.lockpick(options) -- 'opened' | 'broken' | 'cancelled', bir thread içinde çağır

Parametreler

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" });
}

Bu sayfada