AI Core
Dokumentacja APILib: shared i fivem

Geometria stref

zoneContains, zoneBounds, polyFromCorners i readZoneShape: czy punkt jest wewnątrz obszaru, na serwerze, na kliencie albo w NUI.

Obszar w świecie to ZoneShape: kula, walec albo wielokąt na ziemi między dwiema wysokościami. Kliencka klasa Zones (callbacki wejścia i wyjścia, zobacz Strefy) używa tych kształtów; funkcje z tej strony to sama matematyka za nią, bez natywek, więc serwer może sprawdzić ten sam obszar (czy gracz naprawdę jest w sklepie, zanim ten sprzeda?).

TypeScript
import { zoneContains, zoneBounds, polyFromCorners, readZoneShape, type ZoneShape } from "@aicore-fivem/lib/shared";

Lua: żadna z nich nie ma odpowiednika w Lua. Strefy w Lua to aiLib.Zones.new() na kliencie (zobacz Strefy).

zoneContains

Czy punkt leży wewnątrz kształtu strefy.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
zoneContains(shape: ZoneShape, x: number, y: number, z: number): boolean

Parametry

Prop

Type

Zwracana wartość

true, gdy punkt jest wewnątrz (dla kul i walców krawędź liczy się jako wnętrze). Dla walca punkt musi też być w odległości height metrów nad albo pod środkiem. Dla wielokąta z musi być między minZ a maxZ.

Przykład

resource/server/index.ts
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

Prostokąt ograniczający kształt na ziemi: najmniejszy prostokąt (x / y), który go mieści. Używaj go do taniego pierwszego sprawdzenia albo do umieszczenia strefy w komórkach siatki.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
zoneBounds(shape: ZoneShape): [minX: number, minY: number, maxX: number, maxY: number]

Parametry

Prop

Type

Zwracana wartość

[minX, minY, maxX, maxY] w metrach. Dla kuli albo walca: środek plus minus promień.

Przykład

import { zoneBounds } from "@aicore-fivem/lib/shared";

zoneBounds({ type: "sphere", center: { x: 100, y: 200, z: 30 }, radius: 10 }); // [90, 190, 110, 210]

polyFromCorners

Zamienia narożniki zapisane przez widżet zone panelu w kształt wielokąta. Zakres wysokości to najniższe i najwyższe z narożników, poszerzone o height metrów w górę i w dół.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
polyFromCorners(corners: readonly Vec3[], height: number): { type: "poly"; points: Array<{ x: number; y: number }>; minZ: number; maxZ: number } | null

Parametry

Prop

Type

Zwracana wartość

ZoneShape typu poly albo null przy mniej niż trzech narożnikach.

Przykład

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

Sprawdza kształt strefy pochodzący z innego zasobu albo pliku: każda liczba skończona, wielokąt z co najmniej trzema punktami. Używaj jej na kształcie przekazanym do jednego z twoich eksportów.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
readZoneShape(value: unknown): ZoneShape | null

Parametry

Prop

Type

Zwracana wartość

Czysty ZoneShape (dodatkowe pola usunięte) albo null, gdy nie jest prawidłową kulą, walcem ani wielokątem.

Przykład

resource/server/index.ts
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;
});

vector3 z Lua dociera do TypeScript jako tablica, której readZoneShape nie przyjmuje jako center. Wywołujący z Lua podają center = { x = 1.0, y = 2.0, z = 3.0 }.

Na tej stronie