AI Core
Справочник APILib: общее и fivem

Позиции

distance, flatDistance, headingTo, nearestOf, gridCell и cellKey: векторная математика на простых объектах { x, y, z }.

Математика для точек, записанных простыми объектами (Vec3: { x, y, z } в метрах). Им не нужны нативы, поэтому один и тот же код работает на сервере, на клиенте и на странице NUI.

TypeScript
import { distance, flatDistance, headingTo, nearestOf, gridCell, cellKey } from "@aicore-fivem/lib/shared";

В Lua векторная математика встроена: #(a - b) это расстояние между двумя vector3, #(a.xy - b.xy) это расстояние по земле. Lua-аналог есть только у headingTo (aiLib.numbers.headingTo).

distance

Расстояние по прямой между двумя точками, в метрах.

Сторона: Клиент, сервер и NUI · Ждёт: нет

Сигнатура
distance(a: Vec3, b: Vec3): number

Lua: аналога нет; используйте #(a - b) с двумя vector3.

Параметры

Prop

Type

Возвращает

number: метры, 0 или больше.

Пример

resource/server/index.ts
import { coordsOf } from "@aicore-fivem/lib/server";
import { distance } from "@aicore-fivem/lib/shared";

const counter = { x: 25.7, y: -1347.3, z: 29.5 };

function nearCounter(source: number): boolean {
  return distance(coordsOf(source), counter) <= 3;
}

flatDistance

Расстояние по плоскости земли без учёта высоты (только x и y), в метрах. Используйте для областей, где высота не важна (парковка на склоне, радиус блипа).

Сторона: Клиент, сервер и NUI · Ждёт: нет

Сигнатура
flatDistance(a: { x: number; y: number }, b: { x: number; y: number }): number

Lua: аналога нет; используйте #(a.xy - b.xy).

Параметры

Prop

Type

Возвращает

number: метры по плоскости земли.

Пример

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

flatDistance({ x: 0, y: 0, z: 0 }, { x: 3, y: 4, z: 50 }); // 5

headingTo

Направление от одной точки к другой по соглашению GTA: 0-360 градусов, 0 = север, против часовой стрелки. Используйте, чтобы повернуть педа или камеру к чему-либо.

Сторона: Клиент, сервер и NUI · Ждёт: нет

Сигнатура
headingTo(from: { x: number; y: number }, to: { x: number; y: number }): number
Lua
local heading = aiLib.numbers.headingTo(from, to) -- vector3 или таблицы { x, y }

Параметры

Prop

Type

Возвращает

number: направление от 0 до 360 (не включая 360).

Пример

resource/client/index.ts
import { cache, player } from "@aicore-fivem/lib/client";
import { headingTo } from "@aicore-fivem/lib/shared";

const counter = { x: 25.7, y: -1347.3, z: 29.5 };
SetEntityHeading(cache.ped, headingTo(player.coords(), counter));

nearestOf

Элемент списка, ближайший к точке (расстояние в 3D), в пределах необязательного радиуса. Работает с любым списком: вы указываете, как прочитать позицию элемента.

Сторона: Клиент, сервер и NUI · Ждёт: нет

Сигнатура
nearestOf<T>(items: Iterable<T>, point: Vec3, pos: (item: T) => Vec3, max?: number): T | undefined

Lua: аналога нет.

Параметры

Prop

Type

Возвращает

Ближайший элемент или undefined, если список пуст или все элементы дальше max.

Пример

resource/server/index.ts
import { coordsOf } from "@aicore-fivem/lib/server";
import { nearestOf, type Vec3 } from "@aicore-fivem/lib/shared";

const atms: Array<{ id: string; coords: Vec3 }> = [
  { id: "legion", coords: { x: 147.4, y: -1035.8, z: 29.3 } },
  { id: "pillbox", coords: { x: 296.2, y: -591.6, z: 43.3 } },
];

function atmNear(source: number) {
  return nearestOf(atms, coordsOf(source), (atm) => atm.coords, 2);
}

gridCell

Целочисленная ячейка сетки, в которую попадает точка, на сетке из квадратов со стороной size метров. Потоковая передача областей в lib (AreaStream на сервере, AreaFollower на клиенте) использует её, поэтому обе стороны сходятся в том, в какой ячейке находится точка. Ячейки ограничены значениями плюс-минус 16 000.

Сторона: Клиент, сервер и NUI · Ждёт: нет

Сигнатура
gridCell(x: number, y: number, size: number): { cx: number; cy: number }

Lua: аналога нет.

Параметры

Prop

Type

Возвращает

{ cx, cy }: столбец и строка ячейки.

Пример

import { gridCell, cellKey } from "@aicore-fivem/lib/shared";

const { cx, cy } = gridCell(147.4, -1035.8, 100); // { cx: 1, cy: -11 }
const key = cellKey(cx, cy);

cellKey

Одно число для ячейки сетки, достаточно маленькое, чтобы быть быстрым ключом Map (меньше 2^30).

Сторона: Клиент, сервер и NUI · Ждёт: нет

Сигнатура
cellKey(cx: number, cy: number): number

Lua: аналога нет.

Параметры

Prop

Type

Возвращает

number: одно и то же число для одной и той же ячейки на любой стороне.

Пример

import { gridCell, cellKey } from "@aicore-fivem/lib/shared";

const byCell = new Map<number, string[]>();

function addSign(id: string, x: number, y: number): void {
  const { cx, cy } = gridCell(x, y, 100);
  const key = cellKey(cx, cy);
  byCell.set(key, [...(byCell.get(key) ?? []), id]);
}

На этой странице