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
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
camera.start(at: Vec3, view?: CameraView, easeMs?: number): voidParametreler
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
camera.move(at: Vec3, view?: CameraView, ms?: number): voidParametreler
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
camera.glideTo(at: Vec3, view: CameraView, ms: number): voidParametreler
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
camera.attach(entity: number, offset: Vec3, relative?: boolean): voidParametreler
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
camera.pointAt(target: Vec3): voidParametreler
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
camera.setFov(fov: number): voidParametreler
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
camera.shake(type: string, amplitude: number): voidParametreler
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
camera.blur(dof: CameraBlur | null): voidParametreler
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
camera.stop(easeMs?: number): voidParametreler
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
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
new AreaFollower(event: string, cellSize?: number)Lua karşılığı yok.
Parametreler
Prop
Type
Üyeler
Prop
Type
Örnek
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
new ServerClock()Lua karşılığı yok.
Üyeler
Prop
Type
Örnek
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.
Sorgular ve yükleme
raycast, groundZ, locationName, vehicleLabel, waypoint, pedHeadshot, onShot ve request yükleyicileri - oyuna dünya hakkında sormak ve oyun varlıklarını yüklemek.
Üyelik ve oyuncu verisi
hasJob, inGang, onDutyIn, allows, onMembershipChange, getPlayerData, onPlayerData ve seedPlayerData - ai-core’un gönderdiği haliyle yerel oyuncunun karakteri, parası, meslekleri, görev durumu ve çeteleri.