Zonengeometrie
zoneContains, zoneBounds, polyFromCorners und readZoneShape: Liegt ein Punkt in einem Bereich, auf dem Server, dem Client oder in einer NUI.
Ein Bereich in der Welt ist ein ZoneShape: eine Kugel, ein Zylinder oder ein Bodenpolygon zwischen zwei Höhen. Die Client-Klasse Zones (Betreten- und Verlassen-Callbacks, siehe Zonen) nutzt diese Formen; die Helfer auf dieser Seite sind die reine Mathematik dahinter, ohne Natives, sodass der Server denselben Bereich prüfen kann (ist der Spieler wirklich im Shop, bevor er verkauft?).
import { zoneContains, zoneBounds, polyFromCorners, readZoneShape, type ZoneShape } from "@aicore-fivem/lib/shared";Lua: Keiner davon hat einen Lua-Zwilling. Lua-Zonen sind aiLib.Zones.new() auf dem Client (siehe Zonen).
zoneContains
Ob ein Punkt innerhalb einer Zonenform liegt.
Seite: Client, Server und NUI · Wartet: nein
zoneContains(shape: ZoneShape, x: number, y: number, z: number): booleanParameter
Prop
Type
Rückgabewert
true, wenn der Punkt drin ist (auf dem Rand zählt bei Kugeln und Zylindern als drin). Bei einem Zylinder muss der Punkt außerdem innerhalb von height Metern über oder unter dem Mittelpunkt liegen. Bei einem Polygon muss z zwischen minZ und maxZ liegen.
Beispiel
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
Die Bounding Box einer Form am Boden: das kleinste Rechteck (x / y), das sie enthält. Nutze es für eine günstige erste Prüfung oder um eine Zone in Rasterzellen einzuordnen.
Seite: Client, Server und NUI · Wartet: nein
zoneBounds(shape: ZoneShape): [minX: number, minY: number, maxX: number, maxY: number]Parameter
Prop
Type
Rückgabewert
[minX, minY, maxX, maxY] in Metern. Bei einer Kugel oder einem Zylinder: der Mittelpunkt plus und minus der Radius.
Beispiel
import { zoneBounds } from "@aicore-fivem/lib/shared";
zoneBounds({ type: "sphere", center: { x: 100, y: 200, z: 30 }, radius: 10 }); // [90, 190, 110, 210]polyFromCorners
Wandelt die Ecken, die das zone-Widget des Panels speichert, in eine Polygonform um. Der Höhenbereich ist das niedrigste und höchste z der Ecken, um height Meter nach oben und unten erweitert.
Seite: Client, Server und NUI · Wartet: nein
polyFromCorners(corners: readonly Vec3[], height: number): { type: "poly"; points: Array<{ x: number; y: number }>; minZ: number; maxZ: number } | nullParameter
Prop
Type
Rückgabewert
Die Polygon-ZoneShape, oder null bei weniger als drei Ecken.
Beispiel
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
Prüft eine Zonenform, die von einer anderen Ressource oder aus einer Datei kommt: jede Zahl endlich, ein Polygon mit mindestens drei Punkten. Nutze es auf einer Form, die an einen deiner Exports übergeben wird.
Seite: Client, Server und NUI · Wartet: nein
readZoneShape(value: unknown): ZoneShape | nullParameter
Prop
Type
Rückgabewert
Eine saubere ZoneShape (zusätzliche Felder verworfen), oder null, wenn es keine gültige Kugel, kein gültiger Zylinder oder kein gültiges Polygon ist.
Beispiel
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;
});Ein Lua-vector3 kommt in TypeScript als Array an, das readZoneShape nicht als center akzeptiert. Lua-Aufrufer übergeben center = { x = 1.0, y = 2.0, z = 3.0 }.
Logging
createLogger, logSafe und previewJson: Konsolenzeilen mit dem Namen deiner Ressource und nicht vertrauenswürdiger Text, der sicher ausgegeben werden kann.
Lib für Lua
aiLib: wie eine Lua-Ressource ai-lib lädt, wann du einen Thread brauchst, wie Lua-Vektoren und -Tabellen nach TypeScript gelangen, und wo jede Funktion dokumentiert ist.