AI Core
API başvurusuLib: shared ve fivem

Zamanlama ve yaşam döngüsü

every, onStop, caller, ByResource, Reasons, sleep ve waitFor: periyodik işler, beklemek ve onu kaydeden resource’a ait olan veriler.

TypeScript
import { every, onStop, caller, ByResource, Reasons } from "@aicore-fivem/lib/fivem";
import { sleep, waitFor } from "@aicore-fivem/lib/shared";

Periyodik işler

every

Resource’unun tek zamanlayıcısından her ms milisaniyede bir (0 = her kare) bir fonksiyon çalıştırır. setInterval, setTick ya da Wait’li bir CreateThread döngüsü yerine bunu kullan: bir resource’un tüm görevleri tek bir tick’i paylaşır ve o tick yalnızca en az bir görev açıkken var olur; böylece boştaki bir resource resmon’da hiçbir maliyet getirmez.

Taraf: Client ve server · Bekler: hayır

Signature
every(ms: number, fn: () => unknown, options?: EveryOptions): Job
Lua
local job = aiLib.every(ms, fn, options) -- job:set(active), job:stop(), job.running

Parametreler

Prop

Type

EveryOptions

Prop

Type

Dönüş değeri

Job: görevi açıp kapatmak için bir handle.

Prop

Type

Örnek

Yalnızca yapacak bir işi varken çalışan kare başı bir görev:

import { every, cache, onCache } from "@aicore-fivem/lib/client";

// Nişangahı her karede gizler, ama yalnızca elde silah varken.
const hideCrosshair = every(0, () => HideHudComponentThisFrame(14), {
  active: cache.weapon !== false,
  name: "hide crosshair",
});

onCache("weapon", (weapon) => hideCrosshair.set(weapon !== false));

Bir görev asla beklememelidir: Lua’da Wait yok, TypeScript’te bir sonraki çalışmadan önce bitmesini beklediğin uzun bir await zinciri yok. Lua’da bir görev içindeki Wait resource’un diğer her görevini bekletir; bunun için görevden bir thread başlat. Başarısız olan bir görev en fazla 10 saniyede bir loglanır (aradaki hatalar bir sonraki satıra sayı olarak eklenir).

Beklemek

sleep

ms milisaniye bekler.

Taraf: Client, server ve NUI · Bekler: evet (Promise)

Signature
sleep(ms: number): Promise<void>

Lua: karşılığı yok; bir thread içinde Wait(ms) kullan.

Parametreler

Prop

Type

Dönüş değeri

ms milisaniye sonra çözülen Promise<void>.

Örnek

import { sleep } from "@aicore-fivem/lib/shared";
import { fadeOut, fadeIn } from "@aicore-fivem/lib/client";

async function blink(): Promise<void> {
  await fadeOut(300);
  await sleep(1000);
  await fadeIn(300);
}

waitFor

Bir koşulu bir değer verene kadar kontrol eder, sonra o değeri döndürür. Oyunun kendi zamanında yaptığı bir şeyi beklemek için kullan: bir entity’nin var olması, bir modelin yüklenmesi, bir değerin gelmesi.

Taraf: Client, server ve NUI · Bekler: evet (TypeScript’te Promise, Lua’da thread’i yield eder)

Signature
waitFor<T>(check: () => T | undefined, timeoutMs?: number | false, intervalMs?: number): Promise<T>
Lua
local value = aiLib.waitFor(check, timeout, interval) -- değer ya da zaman aşımından sonra nil; bir thread içinde çağır

Parametreler

Prop

Type

Dönüş değeri

TypeScript: check’in döndürdüğü, undefined olmayan ilk değerle çözülen Promise<T>. Zaman aşımından sonra Error("waitFor timed out after <ms> ms") ile reddedilir.

Lua: değer ya da zaman aşımından sonra nil (hata fırlatmaz).

Örnek

import { waitFor } from "@aicore-fivem/lib/shared";

async function vehicleFromNet(netId: number): Promise<number | null> {
  try {
    return await waitFor(() => {
      const vehicle = NetworkGetEntityFromNetworkId(netId);
      return DoesEntityExist(vehicle) ? vehicle : undefined;
    }, 5000);
  } catch {
    return null; // 5 saniye içinde stream edilmedi
  }
}

TypeScript’te reddetmeyi her zaman ele al (try / catch ya da .catch()) veya zaman aşımı olarak false geçir. Lua’da waitFor yalnızca bir thread içinde çalışır.

Resource yaşam döngüsü

onStop

Resource’un durduğunda (kodun çalıştığı tarafta) bir fonksiyon çalıştırır. Native’lerin oluşturduğu ve başka hiçbir şeyin kaldırmadığı şeyleri silmek için kullan: oluşturduğun entity’ler, kameralar, bir NUI odağı.

Taraf: Client ve server · Bekler: hayır

Signature
onStop(fn: () => void): void

Lua: karşılığı yok; AddEventHandler('onResourceStop', function(name) if name == GetCurrentResourceName() then ... end end) kullan.

Parametreler

Prop

Type

Dönüş değeri

void.

Örnek

resource/server/index.ts
import { onStop } from "@aicore-fivem/lib/server";

const spawned = new Set<number>();

onStop(() => {
  for (const entity of spawned) if (DoesEntityExist(entity)) DeleteEntity(entity);
});

Bir resource’un tüm onStop, ByResource ve Reasons’ları tek bir durdurma dinleyicisini paylaşır; bu yüzden çok sayıda eklemek ekstra bir maliyet getirmez.

caller

Şu an çalışan export’u çağıran resource’un adı. Kendi kodunun içinde (bir export çağrısında değil) senin resource’unun adıdır.

Taraf: Client ve server · Bekler: hayır

Signature
caller(): string

Lua: karşılığı yok; GetInvokingResource() or GetCurrentResourceName() kullan.

Dönüş değeri

string: çağıran resource’un adı ya da başka hiçbir resource çağırmıyorsa bu resource’un adı.

Örnek

resource/server/index.ts
import { registerExport, caller } from "@aicore-fivem/lib/server";

registerExport("Ping", () => {
  console.log(`${caller()} asked for a ping`);
  return true;
});

ByResource

Girdileri onları ayarlayan resource’a ait olan bir map. O resource durduğunda girdileri hemen kaldırılır (ve her biri için onDrop çalışır). Diğer resource’ların senin export’ların üzerinden kaydettiği şeyler için kullan: hook’lar, istemler, eşyalar, menü girdileri.

Taraf: Client ve server · Bekler: hayır

Signature
new ByResource<K, V>(options?: { onDrop?: (resource: string, key: K, value: V) => void })

Lua: karşılığı yok.

Parametreler

Prop

Type

Metotlar

Prop

Type

Örnek

resource/server/index.ts
import { ByResource, registerExport } from "@aicore-fivem/lib/server";
import { readText } from "@aicore-fivem/lib/shared";

type Hook = (source: number, text: string) => boolean;
const hooks = new ByResource<string, Hook>({
  onDrop: (resource, id) => console.log(`${resource} stopped: hook ${id} removed`),
});

// Başka bir resource: exports["my-chat"].AddHook("swear-filter", (source, text) => ...)
registerExport("AddHook", (id: unknown, hook: unknown) => {
  const name = readText(id, 64);
  if (name === null || typeof hook !== "function") return false;
  hooks.set(name, hook as Hook); // sahip = AddHook’u çağıran resource
  return true;
});

export function allowed(source: number, text: string): boolean {
  for (const hook of hooks.values()) if (!hook(source, text)) return false;
  return true;
}

Reasons

En az bir sebep ayarlıyken açık olan bir anahtar. Her resource kendi adlandırılmış sebeplerini ayarlar ve duran bir resource’un sebepleri temizlenir. "HUD’u gizle", "senkronu duraklat", "menüyü engelle" için kullan: birkaç script aynı anda isteyebilir ve durum yalnızca sonuncusu bıraktığında geri döner.

Taraf: Client ve server · Bekler: hayır

Signature
new Reasons()

Lua: karşılığı yok.

Metotlar

Prop

Type

Örnek

resource/client/index.ts
import { Reasons, registerExport } from "@aicore-fivem/lib/client";
import { readText } from "@aicore-fivem/lib/shared";

const hidden = new Reasons();
hidden.onChange((any) => SendNUIMessage({ action: "visible", value: !any }));

// Diğer resource’lar: exports["my-hud"].Hide("cutscene") ve exports["my-hud"].Show("cutscene")
registerExport("Hide", (reason: unknown) => {
  const name = readText(reason, 64);
  if (name !== null) hidden.set(name, true);
});
registerExport("Show", (reason: unknown) => {
  const name = readText(reason, 64);
  if (name !== null) hidden.set(name, false);
});

Bu sayfada