Зоны
Zones - области с колбэками входа и выхода (сфера, цилиндр, полигон), которые проверяются со своим интервалом и никогда не каждый кадр.
Зона это область, которая выполняет код, когда игрок входит в неё или выходит из неё: вход в район, область ограничения скорости, маркер, который рисуется только поблизости. Когда игрок должен что-то сделать в этом месте (нажать клавишу, выбрать опцию target), используйте точку: это зона с уже подключёнными подсказкой, target, педом и блипом.
В TypeScript каждую зону проверяет единая проверка ai-lib для всех ресурсов (зоны лежат в сетке по 64 м, поэтому миллион зон стоит столько же, сколько несколько). Ваш ресурс проверяет свои зоны сам, только пока ai-lib не запущен. В Lua каждый ресурс запускает одну задачу планировщика для своих зон.
new Zones
Создаёт группу зон. Создайте одну группу на функцию в начале файла.
Сторона: Клиент · Ждёт: нет
new Zones()local zones = aiLib.Zones.new()Возвращает
Группа Zones с методами ниже.
Пример
import { Zones } from "@aicore-fivem/lib/client";
const zones = new Zones();zones.add
Добавляет зону или заменяет зону с тем же id. Если в заменяемой зоне был игрок, сначала выполняется её onExit.
Сторона: Клиент · Ждёт: нет
zones.add(id: string, options: ZoneOptions): voidzones:add(id, options)Параметры
Prop
Type
ZoneOptions
Prop
Type
ZoneShape
ZoneShape это один из трёх объектов, выбираемый по type:
Prop
Type
В Lua center может быть vector3, а точки таблицами { x = ..., y = ... }.
Возвращает
void.
Пример
import { createLocale, notify, Zones } from "@aicore-fivem/lib/client";
const Locale = createLocale<typeof import("../../locales/en.json")>();
const zones = new Zones();
zones.add("safezone", {
shape: { type: "cylinder", center: { x: 298.6, y: -584.5, z: 43.3 }, radius: 60, height: 30 },
onEnter: () => notify(Locale("SAFEZONE_IN"), "info"),
onExit: () => notify(Locale("SAFEZONE_OUT"), "info"),
});
zones.add("yard", {
shape: {
type: "poly",
points: [
{ x: 1700.1, y: 2560.4 },
{ x: 1780.6, y: 2560.4 },
{ x: 1780.6, y: 2620.2 },
{ x: 1700.1, y: 2620.2 },
],
minZ: 40,
maxZ: 60,
},
interval: 1000,
onEnter: () => SetPedMoveRateOverride(PlayerPedId(), 0.8),
});Зона, нарисованная в вашей админ-панели виджетом zone, даёт углы; превратите их в полигон через polyFromCorners(corners, height) из @aicore-fivem/lib/shared. Сервер может проверить те же формы через zoneContains(shape, x, y, z).
zones.remove
Удаляет одну зону. Если игрок был внутри, выполняется onExit. Неизвестный id ничего не делает.
Сторона: Клиент · Ждёт: нет
zones.remove(id: string): voidzones:remove(id)Параметры
Prop
Type
Возвращает
void.
Пример
zones.remove("safezone");zones.clear
Удаляет все зоны группы; onExit выполняется для тех, в которых находится игрок.
Сторона: Клиент · Ждёт: нет
zones.clear(): voidzones:clear()Возвращает
void.
Пример
onServerEvent("myscript:eventOver", () => zones.clear());zones.isInside
Находится ли игрок внутри зоны, по результату её последней проверки.
Сторона: Клиент · Ждёт: нет
zones.isInside(id: string): booleanlocal inside = zones:isInside(id)Параметры
Prop
Type
Возвращает
boolean: true, пока внутри; false снаружи или для неизвестного id. Отражает последнюю проверку, поэтому может устареть до interval мс.
Пример
if (zones.isInside("safezone")) return notify(Locale("NO_WEAPONS_HERE"), "error");zones.size
Сколько зон содержит группа.
Сторона: Клиент · Ждёт: нет
zones.size: number // свойство только для чтенияLua-аналога нет.
Возвращает
number: количество зон в этой группе.
Пример
console.log(`${zones.size} zones loaded`);Точки взаимодействия
Points - каждое место, которым пользуется игрок (прилавки, магазины, двери, NPC, банкоматы, багажники транспорта), в виде подсказки или опции target, с педами, блипами и точками, построенными из записей панели.
Педы, блипы и пропы
LocalPed, Blips, createBlip, attachProp, PreviewVehicle и player.holdAnim - локальные NPC, блипы на карте, пропы в руках, витринный транспорт и удерживаемые анимации.