AI Core
API başvurusuLib: client

Kamera ve zamanlama

ScriptCamera, TickLoop, AreaFollower ve ServerClock - script kameraları, yalnızca gerektiğinde çalışan kare başı görevler, oyuncunun alanını server’a bildirmek ve server’ın saatini client’ta kullanmak.

Galeriler ve sahneler için bir script kamerası, yalnızca gerektiğinde açtığın kare başı bir görev, server’ın alan yayınının client yarısı ve geri sayımlar için server’ın saati. Genel olarak periyodik işler every(ms, fn)’dir (bkz. Lib: shared ve fivem); asla setInterval ya da çıplak bir setTick değil.

ScriptCamera

new ScriptCamera

Bir script kamerası: bir marketin galeri görünümü, bir editör, bir sahne, bir dürbün. start onu oluşturur ve gösterir, diğer metotlar onu hareket ettirir ve değiştirir, stop yumuşakça oyun kamerasına döner ve onu yok eder. Resource’un durduğunda hâlâ çalışan bir kamera hemen geri verilir; böylece oyuncu asla içinde sıkışıp kalmaz.

Taraf: Client · Bekler: hayır

Signature
new ScriptCamera(type?: string)

Lua karşılığı yok: Lua resource’ları CreateCam, RenderScriptCams ve DestroyCam kullanır.

Parametreler

Prop

Type

CameraView

Bir kameranın nereye baktığı; start, move ve glideTo tarafından kullanılır:

Prop

Type

Üyeler

Prop

Type

Örnek

import { ScriptCamera } from "@aicore-fivem/lib/client";

const camera = new ScriptCamera();
const CAR = { x: -44.4, y: -1097.1, z: 26.4 };

export function openShowroom(): void {
  camera.start({ x: -40.2, y: -1100.5, z: 27.6 }, { pointAt: CAR, fov: 50 }, 800);
}

export function frontView(): void {
  camera.glideTo({ x: -47.5, y: -1093.8, z: 27.2 }, { pointAt: CAR, fov: 45 }, 1200);
}

export function closeShowroom(): void {
  camera.stop(800);
}

camera.start

Kamerayı oluşturur (henüz yoksa), bir noktaya koyar ve oyun kamerasından yumuşak geçişle görünüm yapar.

Taraf: Client · Bekler: hayır

Signature
camera.start(at: Vec3, view?: CameraView, easeMs?: number): void

Parametreler

Prop

Type

Dönüş değeri

void. Sınıf örneğine bak.

camera.move

Kamerayı hemen ya da kayarak (oyun ara değerleri hesaplar) hareket ettirir. Durmuşken hiçbir şey yapmaz.

Taraf: Client · Bekler: hayır

Signature
camera.move(at: Vec3, view?: CameraView, ms?: number): void

Parametreler

Prop

Type

Dönüş değeri

void.

Örnek

camera.move({ x: -42.0, y: -1099.0, z: 28.5 }, { pointAt: CAR }, 600);

camera.glideTo

Yeni bir çekime geçiş yapar: yeni yerdeki ikinci bir kamera bundan devralır ve eskisi geçişten sonra yok edilir. Sarsıntı ve bulanıklık aktarılır. Kamera durmuşsa (ya da ms 0 ise) onu başlatır.

Taraf: Client · Bekler: hayır

Signature
camera.glideTo(at: Vec3, view: CameraView, ms: number): void

Parametreler

Prop

Type

Dönüş değeri

void. Sınıf örneğine bak.

camera.attach

Kameranın bir entity’yi, entity’nin kendi uzayında bir ofsetle takip etmesini sağlar.

Taraf: Client · Bekler: hayır

Signature
camera.attach(entity: number, offset: Vec3, relative?: boolean): void

Parametreler

Prop

Type

Dönüş değeri

void.

Örnek

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

const chase = new ScriptCamera();
if (cache.vehicle !== false) {
  chase.start({ x: 0, y: 0, z: 0 });
  chase.attach(cache.vehicle, { x: 0, y: -6, z: 2 });
}

camera.pointAt

Kameranın bir noktaya bakmaya devam etmesini sağlar.

Taraf: Client · Bekler: hayır

Signature
camera.pointAt(target: Vec3): void

Parametreler

Prop

Type

Dönüş değeri

void.

camera.setFov

Görüş alanını (yakınlaştırmayı) değiştirir.

Taraf: Client · Bekler: hayır

Signature
camera.setFov(fov: number): void

Parametreler

Prop

Type

Dönüş değeri

void.

Örnek

// Dürbün: fare tekerleğiyle yakınlaştır.
let fov = 40;
export function zoom(step: number): void {
  fov = Math.min(70, Math.max(5, fov + step));
  camera.setFov(fov);
}

camera.shake

Oyunun kamera sarsıntısını ekler. Genlik 0 onu durdurur.

Taraf: Client · Bekler: hayır

Signature
camera.shake(type: string, amplitude: number): void

Parametreler

Prop

Type

Dönüş değeri

void.

Örnek

camera.shake("HAND_SHAKE", 0.3);

camera.blur

Alan derinliği: iki mesafe arası net, dışı bulanık. Hiçbiri için null geçir. Kare başı bir native’e ihtiyaç duyar; bu native yalnızca bir bulanıklık ayarlıyken çalışır.

Taraf: Client · Bekler: hayır

Signature
camera.blur(dof: CameraBlur | null): void

Parametreler

Prop

Type

Dönüş değeri

void.

Örnek

camera.blur({ near: 2, far: 8, strength: 0.8 });

camera.stop

Görünümü oyun kamerasına geri verir (easeMs boyunca yumuşak geçişle) ve kamerayı yok eder. Sarsıntı ve bulanıklık da biter. Durmuşken hiçbir şey yapmaz.

Taraf: Client · Bekler: hayır

Signature
camera.stop(easeMs?: number): void

Parametreler

Prop

Type

Dönüş değeri

void. Sınıf örneğine bak.

TickLoop

new TickLoop

Sen açana kadar kapalı olan kare başı bir görev (resource’unun tek zamanlayıcısında every(0, fn)). Yalnızca bazen her karede çalışması gereken her şey için kullan: yakındayken bir marker çizmek, bir yerleştirme önizlemesi, bir arkadaşa nişan alırken ateş etmeyi kapatmak.

Taraf: Client · Bekler: hayır

Signature
new TickLoop(onFrame: () => void, name?: string)

Lua karşılığı yok: aiLib.every(0, fn, { active = false, name = name }) ve job:set(active).

Parametreler

Prop

Type

Üyeler

Prop

Type

Örnek

import { TickLoop, Zones } from "@aicore-fivem/lib/client";

const SPOT = { x: 215.8, y: -810.1, z: 30.7 };
const light = new TickLoop(() => {
  DrawLightWithRange(SPOT.x, SPOT.y, SPOT.z + 2, 61, 247, 158, 8, 4);
}, "garageLight");

const zones = new Zones();
zones.add("garage", {
  shape: { type: "sphere", center: SPOT, radius: 25 },
  onEnter: () => light.set(true),
  onExit: () => light.set(false),
});

Resource’unun her görevi, yalnızca bir görev açıkken var olan tek bir setTick’ten çalışır. Döngüyü dosyanın en üstünde bir kez oluştur ve her başlatmada yenisini oluşturmak yerine onu aç kapa.

AreaFollower

new AreaFollower

Bir server AreaStream’inin client yarısı (Alan yayını): oyuncunun durduğu ızgara hücresi değiştiğinde bunu server’a söyler (başlatılmışken 2 saniyede bir kontrol edilir); böylece server yalnızca oyuncunun etrafındaki dünya nesnelerini (yere atılanlar, bitkiler, yerleştirilmiş prop’lar) gönderir. Dosyanın en üstünde bir tane oluştur.

Taraf: Client · Bekler: hayır

Signature
new AreaFollower(event: string, cellSize?: number)

Lua karşılığı yok.

Parametreler

Prop

Type

Üyeler

Prop

Type

Örnek

resource/client/index.ts
import { AreaFollower, onServerEvent } from "@aicore-fivem/lib/client";

const follower = new AreaFollower("myplants:cell");
follower.start();

const plants = new Map<number, unknown>();

// Yayın (reset, puts, removes) gönderir: reset true ile bir snapshot, sonra yalnızca değişiklikler.
onServerEvent(
  "myplants:area",
  {
    args: ([reset, puts, removes]) =>
      typeof reset === "boolean" && Array.isArray(puts) && Array.isArray(removes)
        ? ([reset, puts, removes] as const)
        : null,
  },
  (reset, puts, removes) => {
    if (reset) plants.clear();
    for (const plant of puts as Array<{ id?: unknown } | null>)
      if (typeof plant?.id === "number") plants.set(plant.id, plant);
    for (const id of removes) if (typeof id === "number") plants.delete(id);
  },
);

Server bildirilen bir hücreyi oyuncunun gerçek konumuyla karşılaştırır (followReported yalnızca ped’e bir hücre uzaklıktaki hücreleri kabul eder); böylece bir hileci uzak bir alanı isteyemez.

ServerClock

new ServerClock

Server’ın saati, client’ta. Client ve server saatleri farklı olabilir; bu yüzden bir server zamanına geri sayım (bir soygun cooldown’ı, bir açık artırmanın bitişi) önce yerel zamana çevrilmelidir. Bir snapshot ya da başlangıç mesajı geldiğinde her seferinde server’ın Date.now() değeriyle sync’i çağır.

Taraf: Client (@aicore-fivem/lib/shared’dan) · Bekler: hayır

Signature
new ServerClock()

Lua karşılığı yok.

Üyeler

Prop

Type

Örnek

resource/client/index.ts
import { every, onServerEvent } from "@aicore-fivem/lib/client";
import { ServerClock } from "@aicore-fivem/lib/shared";

const clock = new ServerClock();
let endsAt = 0; // yerel zaman

onServerEvent(
  "myauction:state",
  { args: ([now, ends]) => (typeof now === "number" && typeof ends === "number" ? [now, ends] : null) },
  (now, ends) => {
    clock.sync(now);
    endsAt = clock.toLocal(ends);
  },
);

every(1000, () => {
  const left = Math.max(0, Math.round((endsAt - Date.now()) / 1000));
  SendNUIMessage({ action: "countdown", data: left });
});

Server bitiş zamanını bir kez gönderir; client kendi saatiyle geri sayar. Kalan süreyi asla her saniye gönderme.

Bu sayfada