AI Core
Referencia de la APILib: compartido y fivem

Geometría de zonas

zoneContains, zoneBounds, polyFromCorners y readZoneShape: si un punto está dentro de un área, en el servidor, en el cliente o en una NUI.

Un área del mundo es un ZoneShape: una esfera, un cilindro o un polígono en el suelo entre dos alturas. La clase Zones del cliente (callbacks de entrada y salida, consulta Zonas) usa estas formas; las utilidades de esta página son las matemáticas simples que hay detrás, sin natives, para que el servidor pueda comprobar la misma área (¿está el jugador de verdad dentro de la tienda antes de venderle?).

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

Lua: ninguna de estas tiene equivalente en Lua. Las zonas en Lua son aiLib.Zones.new() en el cliente (consulta Zonas).

zoneContains

Si un punto está dentro de una forma de zona.

Lado: Cliente, servidor y NUI · Espera: no

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

Parámetros

Prop

Type

Devuelve

true cuando el punto está dentro (en el borde cuenta como dentro para esferas y cilindros). Para un cilindro, el punto también debe estar a menos de height metros por encima o por debajo del centro. Para un polígono, z debe estar entre minZ y maxZ.

Ejemplo

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

La caja delimitadora en el suelo de una forma: el rectángulo más pequeño (x / y) que la contiene. Úsalo para una primera comprobación barata, o para colocar una zona en celdas de una cuadrícula.

Lado: Cliente, servidor y NUI · Espera: no

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

Parámetros

Prop

Type

Devuelve

[minX, minY, maxX, maxY] en metros. Para una esfera o un cilindro: el centro más y menos el radio.

Ejemplo

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

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

polyFromCorners

Convierte las esquinas que guarda el widget zone del panel en una forma de polígono. El rango de alturas va de la z más baja a la más alta de las esquinas, ampliado height metros hacia arriba y hacia abajo.

Lado: Cliente, servidor y NUI · Espera: no

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

Parámetros

Prop

Type

Devuelve

El ZoneShape poly, o null con menos de tres esquinas.

Ejemplo

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

Comprueba una forma de zona que viene de otro recurso o de un archivo: todos los números finitos, un polígono con al menos tres puntos. Úsalo en una forma pasada a uno de tus exports.

Lado: Cliente, servidor y NUI · Espera: no

Firma
readZoneShape(value: unknown): ZoneShape | null

Parámetros

Prop

Type

Devuelve

Un ZoneShape limpio (sin campos extra), o null cuando no es una esfera, un cilindro o un polígono válido.

Ejemplo

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;
});

Un vector3 de Lua llega a TypeScript como un array, que readZoneShape no acepta como center. Quien llama desde Lua pasa center = { x = 1.0, y = 2.0, z = 3.0 }.

En esta página