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

Транспорт и сущности

nearestVehicle, drivenVehicle, waitForEntity, entityFromNetId и помощники свойств транспорта - поиск транспорта и сущностей на клиенте, чтение и применение внешнего вида транспорта.

Поиск транспорта рядом с игроком, превращение сетевых id от сервера в локальные сущности, чтение и применение внешнего вида транспорта. Спавн транспорта есть только на сервере (spawnVehicle на странице Транспорт); локальная машина для витрины это PreviewVehicle.

Поиск транспорта

nearestVehicle

Ближайший транспорт на расстоянии от локального игрока. Транспорт, в котором сидит игрок, побеждает первым, если не задан notOwn. Используйте filter, чтобы пропускать неподходящий транспорт, тогда багажник, за которым стоит игрок, победит более близкую машину рядом.

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

Сигнатура
nearestVehicle(metres: number, options?: { networked?: boolean; notOwn?: boolean; filter?: (vehicle: number) => boolean }): number
Lua
local vehicle = aiLib.nearestVehicle(metres, options) -- 0, если ничего нет

Параметры

Prop

Type

Опции

Prop

Type

Возвращает

number: хэндл транспорта или 0, если в пределах metres ничего нет.

Пример

import { callAction, nearestVehicle, notify } from "@aicore-fivem/lib/client";

export async function impound(): Promise<void> {
  const vehicle = nearestVehicle(5, { notOwn: true, filter: (v) => GetPedInVehicleSeat(v, -1) === 0 });
  if (!vehicle) return notify("No empty vehicle near", "error");
  await callAction("mypolice:impound", [NetworkGetNetworkIdFromEntity(vehicle)], { fallback: "IMPOUND_FAILED" });
}

Она перебирает весь транспорт, который знает клиент, поэтому вызывайте её по нажатию клавиши или при действии, а не каждый кадр. Отправляйте транспорт на сервер как сетевой id; сервер превращает его обратно через vehicleFromNet или vehicleNearPlayer и проверяет расстояние.

drivenVehicle

Транспорт, которым управляет локальный игрок (сидит на месте водителя).

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

Сигнатура
drivenVehicle(): number | false

Lua-аналога нет: aiLib.cache.seat == -1 and aiLib.cache.vehicle.

Возвращает

number | false: хэндл транспорта, если игрок водитель, false, если пешком или пассажир.

Пример

import { drivenVehicle, notify } from "@aicore-fivem/lib/client";

RegisterCommand(
  "flip",
  () => {
    const vehicle = drivenVehicle();
    if (vehicle === false) return notify("You must drive a vehicle", "error");
    SetVehicleOnGroundProperly(vehicle);
  },
  false,
);

Сущности по сетевым id

Сервер отправляет сущности как сетевые id. На клиенте сущности может ещё не быть (игрок далеко или она только что создана).

waitForEntity

Ждёт, пока сущность сетевого id появится на этом клиенте, и возвращает её.

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

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

Параметры

Prop

Type

Возвращает

Promise<number>: хэндл локальной сущности или 0 после тайм-аута. Никогда не отклоняется.

Пример

import { onServerEvent, waitForEntity } from "@aicore-fivem/lib/client";
import { readId } from "@aicore-fivem/lib/shared";

// Сервер создал рабочий транспорт и отправляет его сетевой id.
onServerEvent(
  "myjob:vehicle",
  { args: ([id]) => { const netId = readId(id); return netId === null ? null : [netId]; } },
  async (netId) => {
    const vehicle = await waitForEntity(netId);
    if (vehicle) SetVehicleFuelLevel(vehicle, 100);
  },
);

entityFromNetId

Локальная сущность сетевого id прямо сейчас, без ожидания. Необязательно проверяет тип сущности.

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

Сигнатура
entityFromNetId(netId: number, type?: 1 | 2 | 3): number

Lua-аналога нет: NetworkDoesEntityExistWithNetworkId(netId) and NetToEnt(netId) or 0.

Параметры

Prop

Type

Возвращает

number: хэндл сущности или 0, если её нет на этом клиенте или она не типа type.

Пример

import { entityFromNetId, EntityState, stateBoolean } from "@aicore-fivem/lib/client";

const sirens = new EntityState("sirensMuted", stateBoolean);

sirens.onChange((netId, muted) => {
  const vehicle = entityFromNetId(netId, 2);
  if (vehicle) SetVehicleHasMutedSirens(vehicle, muted === true);
});

Внешний вид транспорта

getVehicleProps

Читает все свойства транспорта, которые видит этот клиент: номер, цвета, моды, дополнения, неон, повреждения. Сохраните результат, чтобы позже вернуть тот же внешний вид.

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

Сигнатура
getVehicleProps(vehicle: number): VehicleProps

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

Параметры

Prop

Type

Возвращает

VehicleProps: v (версия формата 1), model, plate (без пробелов по краям), plateIndex, colors, extraColors, customPrimary, customSecondary (RGB или null), wheelType, windowTint, livery, mods (по типу мода 0-49; переключаемые моды 17-22 как 1 или 0), xenonColor, neon (четыре булевых значения), neonColor, tyreSmoke, extras (по id дополнения), dirt, engineHealth, bodyHealth.

Пример

import { callAction, drivenVehicle, getVehicleProps } from "@aicore-fivem/lib/client";

export async function saveLook(): Promise<void> {
  const vehicle = drivenVehicle();
  if (vehicle === false) return;
  await callAction("mygarage:saveProps", [NetworkGetNetworkIdFromEntity(vehicle), getVehicleProps(vehicle)], { fallback: "SAVE_FAILED" });
}

Свойства приходят с клиента игрока: сервер должен разобрать и проверить их (toVehicleProps из @aicore-fivem/lib/shared) перед сохранением.

setVehicleProps

Применяет сохранённые свойства к транспорту. Работает только с транспортом, который контролирует этот клиент; другие игроки получают внешний вид по сети.

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

Сигнатура
setVehicleProps(vehicle: number, props: VehicleProps): void

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

Параметры

Prop

Type

Возвращает

void.

Пример

import { onServerEvent, setVehicleProps, waitForEntity } from "@aicore-fivem/lib/client";
import { readId, toVehicleProps } from "@aicore-fivem/lib/shared";

onServerEvent(
  "mygarage:look",
  {
    args: ([id, raw]) => {
      const netId = readId(id);
      const props = toVehicleProps(raw);
      return netId === null || props === null ? null : [netId, props];
    },
  },
  async (netId, props) => {
    const vehicle = await waitForEntity(netId);
    if (vehicle && NetworkHasControlOfEntity(vehicle)) setVehicleProps(vehicle, props);
  },
);

Транспорту, созданному через spawnVehicle({ props }), ai-core уже применяет внешний вид на клиенте-владельце. setVehicleProps нужен только для ваших собственных сценариев.

setVehicleSetup

Применяет настройку спавна к новому транспорту: максимальная производительность, цвета, ливрея, тонировка, грязь, запущенный двигатель. Работает только с транспортом, который контролирует этот клиент.

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

Сигнатура
setVehicleSetup(vehicle: number, setup: VehicleSetup): void

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

Параметры

Prop

Type

VehicleSetup

Prop

Type

Тип: VehicleSetup.

Возвращает

void.

Пример

import { PreviewVehicle, setVehicleSetup } from "@aicore-fivem/lib/client";

const preview = new PreviewVehicle();

export function showMaxed(model: string): Promise<number> {
  return preview.show(model, { x: -44.4, y: -1097.1, z: 26.4, heading: 120 }, (vehicle) =>
    setVehicleSetup(vehicle, { maxed: true, primary: [20, 200, 120], windowTint: 1 }),
  );
}

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