AI Core
Справочник APILib: клиент

Замеры и загрузка

raycast, groundZ, locationName, vehicleLabel, waypoint, pedHeadshot, onShot и загрузчики request - вопросы к игре о мире и загрузка игровых ресурсов.

Вопросы к игре о мире (что перед игроком, на какой высоте земля, как называется эта улица) и загрузчики, которые нужны каждой модели, анимации и эффекту перед использованием.

Замеры

raycast

Замер по линии с ответом в том же кадре: во что первым попадает линия от from до to. Используйте для «на что смотрит игрок», размещения объектов на земле или проверки прямой видимости.

Сторона: Клиент · Ждёт: нет (блокирует кадр, пока проверка не завершится)

Сигнатура
raycast(from: Vec3, to: Vec3, options?: RaycastOptions): RayHit | null
Lua
local hit = aiLib.raycast(from, to, options) -- таблица или nil; from / to это vector3

Параметры

Prop

Type

RaycastOptions

Prop

Type

Возвращает

RayHit | null: { coords, normal, entity } для первого попадания или null (nil), если линия ни во что не попала.

Prop

Type

Пример

import { raycast } from "@aicore-fivem/lib/client";

/** What the camera looks at within 10 m. */
export function lookedAt(): number {
  const [cx = 0, cy = 0, cz = 0] = GetGameplayCamCoord();
  const [rx = 0, , rz = 0] = GetGameplayCamRot(2);
  const pitch = (rx * Math.PI) / 180;
  const yaw = (rz * Math.PI) / 180;
  const dir = { x: -Math.sin(yaw) * Math.cos(pitch), y: Math.cos(yaw) * Math.cos(pitch), z: Math.sin(pitch) };
  const hit = raycast(
    { x: cx, y: cy, z: cz },
    { x: cx + dir.x * 10, y: cy + dir.y * 10, z: cz + dir.z * 10 },
    { flags: 2 | 4 | 16 },
  );
  return hit?.entity ?? 0;
}

Это синхронный замер: делайте не больше одного-двух за кадр.

groundZ

Высота земли под точкой, замер вниз от z.

Сторона: Клиент · Ждёт: нет

Сигнатура
groundZ(x: number, y: number, z?: number): number | null
Lua
local ground = aiLib.groundZ(x, y, z) -- number или nil

Параметры

Prop

Type

Возвращает

number | null: высота земли или null (nil), пока коллизия там не загружена (область далеко от игрока).

Пример

import { groundZ, player } from "@aicore-fivem/lib/client";

const { x, y, z } = player.coords();
const ground = groundZ(x, y, z + 2);
if (ground !== null) console.log(`ground is ${(z - ground).toFixed(2)} m below`);

Чтобы переместить игрока на неизвестную землю, используйте player.teleport без z: он ждёт коллизию на каждой высоте.

locationName

Названия улицы, пересекающей улицы и района в точке. Используйте в оповещениях диспетчера, сообщениях телефона и HUD.

Сторона: Клиент · Ждёт: нет

Сигнатура
locationName(coords?: Vec3): LocationName
Lua
local where = aiLib.locationName(coords) -- coords это vector3, необязательно

Параметры

Prop

Type

Возвращает

LocationName:

Prop

Type

Пример

import { locationName } from "@aicore-fivem/lib/client";

const { street, crossing, zone } = locationName();
const text = crossing ? `${street} / ${crossing}, ${zone}` : `${street}, ${zone}`;

vehicleLabel

Отображаемое имя транспорта (Sultan RS) по имени модели, хэшу модели или сущности транспорта.

Сторона: Клиент · Ждёт: нет

Сигнатура
vehicleLabel(vehicle: string | number): string
Lua
local name = aiLib.vehicleLabel(vehicle)

Параметры

Prop

Type

Возвращает

string: игровое название модели; отображаемое имя модели, если в игре нет текста для неё (дополнительный транспорт без текстовой записи); имя модели или хэш текстом, если нет даже этого.

Пример

import { cache, notify, onCache, vehicleLabel } from "@aicore-fivem/lib/client";

onCache("vehicle", (vehicle) => {
  if (vehicle !== false && cache.seat === -1) notify(vehicleLabel(vehicle), "info", 2000);
});

waypoint

Метка, которую игрок поставил на карте.

Сторона: Клиент · Ждёт: нет

Сигнатура
waypoint(): { x: number; y: number } | null
Lua
local target = aiLib.waypoint() -- { x, y } или nil

Возвращает

{ x: number; y: number } | null: позиция метки (без высоты: у меток на карте её нет) или null (nil), если метка не поставлена.

Пример

См. player.teleport: телепорт к метке.

pedHeadshot

Делает снимок лица педа и ждёт, пока игра его отрисует. Используйте имя текстуры на странице NUI как https://nui-img/<txd>/<txd>.

Сторона: Клиент · Ждёт: да (Promise в TypeScript, в Lua приостанавливает поток)

Сигнатура
pedHeadshot(ped: number, transparent?: boolean, timeoutMs?: number): Promise<{ handle: number; txd: string } | null>
Lua
local handle, txd = aiLib.pedHeadshot(ped, transparent, timeout) -- вызывайте внутри потока

Параметры

Prop

Type

Возвращает

Promise<{ handle: number; txd: string } | null>: хэндл снимка и имя его текстуры; null, если педа не существует или отрисовка заняла больше тайм-аута. Lua возвращает handle, txd или nil.

Пример

import { cache, pedHeadshot } from "@aicore-fivem/lib/client";

export async function sendMugshot(): Promise<void> {
  const shot = await pedHeadshot(cache.ped, true);
  if (!shot) return;
  SendNUIMessage({ action: "photo", data: `https://nui-img/${shot.txd}/${shot.txd}` });
  setTimeout(() => UnregisterPedheadshot(shot.handle), 10_000);
}

Вызовите UnregisterPedheadshot(handle), как только снимок больше не показывается.

onShot

Запускает обработчик в том кадре, когда локальный пед стреляет (стресс, оповещения о выстрелах, гильзы). Одна покадровая проверка на ваш ресурс, включена только пока в руках оружие.

Сторона: Клиент · Ждёт: нет

Сигнатура
onShot(handler: (weapon: number) => void): () => void
Lua
aiLib.onShot(function(weapon) end) -- ничего не возвращает

Параметры

Prop

Type

Возвращает

TypeScript: () => void, функция, которая удаляет обработчик. Lua ничего не возвращает (обработчик остаётся).

Пример

import { onShot } from "@aicore-fivem/lib/client";

let lastAlert = 0;
onShot(() => {
  if (GetGameTimer() - lastAlert < 30_000) return; // одно оповещение за 30 с
  lastAlert = GetGameTimer();
  emitNet("mypolice:shots");
});

Загрузка игровых ресурсов

Модели, анимации, эффекты и текстуры нужно загрузить перед использованием. Каждый загрузчик запрашивает ресурс и ждёт его готовности. Освобождайте его, когда закончите, как сказано в каждой записи.

requestModel

Загружает модель (пед, транспорт, объект) и возвращает её хэш.

Сторона: Клиент · Ждёт: да (Promise в TypeScript, в Lua приостанавливает поток)

Сигнатура
requestModel(model: string | number, timeoutMs?: number): Promise<number>
Lua
local hash = aiLib.requestModel(model, timeout) -- integer или nil, вызывайте внутри потока

Параметры

Prop

Type

Возвращает

Promise<number>: хэш модели после загрузки. Он отклоняется, если модели нет в файлах игры или она не загрузилась вовремя. Lua возвращает хэш или nil в обоих случаях.

Пример

import { requestModel } from "@aicore-fivem/lib/client";

export async function placeCone(x: number, y: number, z: number): Promise<number> {
  const hash = await requestModel("prop_roadcone02a");
  const cone = CreateObject(hash, x, y, z, false, false, false);
  SetModelAsNoLongerNeeded(hash);
  PlaceObjectOnGroundProperly(cone);
  return cone;
}

Вызовите SetModelAsNoLongerNeeded(hash), как только сущность создана.

requestAnimDict

Загружает словарь анимаций.

Сторона: Клиент · Ждёт: да (Promise в TypeScript, в Lua приостанавливает поток)

Сигнатура
requestAnimDict(dict: string, timeoutMs?: number): Promise<string>
Lua
local dict = aiLib.requestAnimDict(dict, timeout) -- string или nil, вызывайте внутри потока

Параметры

Prop

Type

Возвращает

Promise<string>: имя словаря после загрузки. Он отклоняется, если словаря не существует или он не загрузился вовремя. Lua возвращает имя или nil.

Пример

import { cache, requestAnimDict } from "@aicore-fivem/lib/client";

export async function dance(): Promise<void> {
  const dict = await requestAnimDict("anim@amb@nightclub@dancers@crowddance_facedj@");
  TaskPlayAnim(cache.ped, dict, "hi_dance_facedj_09_v2_male^1", 8, -8, -1, 1, 0, false, false, false);
  RemoveAnimDict(dict);
}

Вызовите RemoveAnimDict(dict), когда анимация больше не проигрывается. player.playAnim загружает и освобождает словарь за вас.

requestAnimSet

Загружает набор клипов движения (ходьба вприсядку, походка раненого).

Сторона: Клиент · Ждёт: да (Promise в TypeScript, в Lua приостанавливает поток)

Сигнатура
requestAnimSet(set: string, timeoutMs?: number): Promise<string>
Lua
local set = aiLib.requestAnimSet(set, timeout) -- string или nil, вызывайте внутри потока

Параметры

Prop

Type

Возвращает

Promise<string>: имя набора клипов после загрузки. Он отклоняется, если набор не загрузился вовремя. Lua возвращает имя или nil.

Пример

import { cache, requestAnimSet } from "@aicore-fivem/lib/client";

export async function limp(): Promise<void> {
  const set = await requestAnimSet("move_m@injured");
  SetPedMovementClipset(cache.ped, set, 0.2);
}

Вызовите RemoveAnimSet(set), когда он больше не используется.

requestPtfxAsset

Загружает ресурс эффекта частиц.

Сторона: Клиент · Ждёт: да (Promise в TypeScript, в Lua приостанавливает поток)

Сигнатура
requestPtfxAsset(asset: string, timeoutMs?: number): Promise<string>
Lua
local asset = aiLib.requestPtfxAsset(asset, timeout) -- string или nil, вызывайте внутри потока

Параметры

Prop

Type

Возвращает

Promise<string>: имя ресурса после загрузки. Он отклоняется, если ресурс не загрузился вовремя. Lua возвращает имя или nil.

Пример

import { player, requestPtfxAsset } from "@aicore-fivem/lib/client";

export async function sparks(): Promise<void> {
  const asset = await requestPtfxAsset("core");
  const { x, y, z } = player.coords();
  UseParticleFxAsset(asset);
  StartParticleFxNonLoopedAtCoord("ent_sht_electrical_box", x, y, z, 0, 0, 0, 1, false, false, false);
  RemoveNamedPtfxAsset(asset);
}

Вызовите RemoveNamedPtfxAsset(asset), когда закончите.

requestTextureDict

Загружает подгружаемый словарь текстур (для DrawSprite и подобных).

Сторона: Клиент · Ждёт: да (Promise в TypeScript, в Lua приостанавливает поток)

Сигнатура
requestTextureDict(dict: string, timeoutMs?: number): Promise<string>
Lua
local dict = aiLib.requestTextureDict(dict, timeout) -- string или nil, вызывайте внутри потока

Параметры

Prop

Type

Возвращает

Promise<string>: имя словаря после загрузки. Он отклоняется, если словарь не загрузился вовремя. Lua возвращает имя или nil.

Пример

import { every, requestTextureDict } from "@aicore-fivem/lib/client";

export async function showCrosshair(): Promise<void> {
  const dict = await requestTextureDict("shared");
  every(0, () => DrawSprite(dict, "emptydot_32", 0.5, 0.5, 0.01, 0.018, 0, 255, 255, 255, 200));
}

Вызовите SetStreamedTextureDictAsNoLongerNeeded(dict), когда закончите.

requestWeaponAsset

Загружает модель и ресурсы оружия и возвращает его хэш.

Сторона: Клиент · Ждёт: да (Promise в TypeScript, в Lua приостанавливает поток)

Сигнатура
requestWeaponAsset(weapon: string | number, timeoutMs?: number): Promise<number>
Lua
local hash = aiLib.requestWeaponAsset(weapon, timeout) -- integer или nil, вызывайте внутри потока

Параметры

Prop

Type

Возвращает

Promise<number>: хэш оружия после загрузки. Он отклоняется, если оружие не загрузилось вовремя. Lua возвращает хэш или nil.

Пример

import { player, requestWeaponAsset } from "@aicore-fivem/lib/client";

export async function showcasePistol(): Promise<number> {
  const hash = await requestWeaponAsset("WEAPON_PISTOL");
  const { x, y, z } = player.coords();
  const object = CreateWeaponObject(hash, 0, x, y, z + 1, true, 1, 0);
  RemoveWeaponAsset(hash);
  return object;
}

Вызовите RemoveWeaponAsset(hash), когда закончите.

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