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.
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
every(ms: number, fn: () => unknown, options?: EveryOptions): Joblocal job = aiLib.every(ms, fn, options) -- job:set(active), job:stop(), job.runningParametreler
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)
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)
waitFor<T>(check: () => T | undefined, timeoutMs?: number | false, intervalMs?: number): Promise<T>local value = aiLib.waitFor(check, timeout, interval) -- değer ya da zaman aşımından sonra nil; bir thread içinde çağırParametreler
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
onStop(fn: () => void): voidLua: karşılığı yok; AddEventHandler('onResourceStop', function(name) if name == GetCurrentResourceName() then ... end end) kullan.
Parametreler
Prop
Type
Dönüş değeri
void.
Örnek
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
caller(): stringLua: 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
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
new ByResource<K, V>(options?: { onDrop?: (resource: string, key: K, value: V) => void })Lua: karşılığı yok.
Parametreler
Prop
Type
Metotlar
Prop
Type
Örnek
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
new Reasons()Lua: karşılığı yok.
Metotlar
Prop
Type
Örnek
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);
});Resource’lar arası export’lar
registerExport, resourceExport, optionalExport, callExport, provideExport ve isResourceStarted: TypeScript’ten export sunmak ve çağırmak.
State bag’ler
EntityState, PlayerState, GlobalKey, GlobalGroup ve stateNumber, stateBoolean, stateString ayrıştırıcıları: replike edilen değerleri bellekten okumak.