Bölge geometrisi
zoneContains, zoneBounds, polyFromCorners ve readZoneShape: bir nokta bir alanın içinde mi; server’da, client’ta ya da bir NUI’da.
Dünyadaki bir alan bir ZoneShape’tir: bir küre, bir silindir ya da iki yükseklik arasında bir zemin çokgeni. Client Zones sınıfı (giriş ve çıkış callback’leri, bkz. Bölgeler) bu şekilleri kullanır; bu sayfadaki yardımcılar onun arkasındaki native’siz düz matematiktir; böylece server aynı alanı kontrol edebilir (oyuncu market satış yapmadan önce gerçekten içeride mi?).
import { zoneContains, zoneBounds, polyFromCorners, readZoneShape, type ZoneShape } from "@aicore-fivem/lib/shared";Lua: bunların hiçbirinin Lua karşılığı yok. Lua bölgeleri client’ta aiLib.Zones.new()’dir (bkz. Bölgeler).
zoneContains
Bir noktanın bir bölge şeklinin içinde olup olmadığı.
Taraf: Client, server ve NUI · Bekler: hayır
zoneContains(shape: ZoneShape, x: number, y: number, z: number): booleanParametreler
Prop
Type
Dönüş değeri
Nokta içerideyse true (küreler ve silindirler için kenar içeride sayılır). Bir silindir için nokta ayrıca merkezin height metre üstünde ya da altında olmalıdır. Bir çokgen için z, minZ ile maxZ arasında olmalıdır.
Örnek
import { coordsOf, onClientCallback } from "@aicore-fivem/lib/server";
import { fail, zoneContains, type ZoneShape } from "@aicore-fivem/lib/shared";
const shop: ZoneShape = { type: "cylinder", center: { x: 25.7, y: -1347.3, z: 29.5 }, radius: 6, height: 3 };
onClientCallback("my-shop:open", (source) => {
const { x, y, z } = coordsOf(source);
if (!zoneContains(shop, x, y, z)) return fail("TOO_FAR");
return { ok: true };
});zoneBounds
Bir şeklin zemindeki sınırlayıcı kutusu: onu içine alan en küçük dikdörtgen (x / y). Ucuz bir ilk kontrol için ya da bir bölgeyi ızgara hücrelerine koymak için kullan.
Taraf: Client, server ve NUI · Bekler: hayır
zoneBounds(shape: ZoneShape): [minX: number, minY: number, maxX: number, maxY: number]Parametreler
Prop
Type
Dönüş değeri
Metre cinsinden [minX, minY, maxX, maxY]. Bir küre ya da silindir için: merkez artı ve eksi yarıçap.
Örnek
import { zoneBounds } from "@aicore-fivem/lib/shared";
zoneBounds({ type: "sphere", center: { x: 100, y: 200, z: 30 }, radius: 10 }); // [90, 190, 110, 210]polyFromCorners
Panelin zone widget’ının kaydettiği köşeleri bir çokgen şekline çevirir. Yükseklik aralığı köşelerin en düşük ve en yüksek z’sidir, height metre yukarı ve aşağı genişletilir.
Taraf: Client, server ve NUI · Bekler: hayır
polyFromCorners(corners: readonly Vec3[], height: number): { type: "poly"; points: Array<{ x: number; y: number }>; minZ: number; maxZ: number } | nullParametreler
Prop
Type
Dönüş değeri
Poly ZoneShape ya da üçten az köşeyle null.
Örnek
import { polyFromCorners } from "@aicore-fivem/lib/shared";
const lot = polyFromCorners(
[ { x: 210, y: -810, z: 30 }, { x: 240, y: -800, z: 31 }, { x: 230, y: -770, z: 32 } ],
3,
);
// { type: "poly", points: [...], minZ: 27, maxZ: 35 }readZoneShape
Başka bir resource’tan ya da bir dosyadan gelen bir bölge şeklini kontrol eder: her sayı sonlu, bir çokgen en az üç noktalı. Export’larından birine geçirilen bir şekil üzerinde kullan.
Taraf: Client, server ve NUI · Bekler: hayır
readZoneShape(value: unknown): ZoneShape | nullParametreler
Prop
Type
Dönüş değeri
Temiz bir ZoneShape (ek alanlar atılır) ya da geçerli bir küre, silindir veya çokgen değilse null.
Örnek
import { registerExport } from "@aicore-fivem/lib/server";
import { readZoneShape, type ZoneShape } from "@aicore-fivem/lib/shared";
const noParking = new Map<string, ZoneShape>();
registerExport("AddNoParkingZone", (id: unknown, raw: unknown) => {
const shape = readZoneShape(raw);
if (typeof id !== "string" || !shape) return false;
noParking.set(id, shape);
return true;
});Bir Lua vector3’ü TypeScript’e bir dizi olarak ulaşır ve readZoneShape bunu bir center olarak kabul etmez. Lua çağıranlar center = { x = 1.0, y = 2.0, z = 3.0 } geçirir.
Loglama
createLogger, logSafe ve previewJson: resource’unun adını taşıyan konsol satırları ve yazdırmak için güvenli hale getirilmiş güvenilmeyen metin.
Lua için lib
aiLib: bir Lua resource’unun ai-lib’i nasıl yüklediği, ne zaman thread kullanılacağı, Lua vektörlerinin ve tablolarının TypeScript’e nasıl geçtiği ve her fonksiyonun nerede belgelendiği.