Транспорт и сущности
nearestVehicle, drivenVehicle, waitForEntity, entityFromNetId и помощники свойств транспорта - поиск транспорта и сущностей на клиенте, чтение и применение внешнего вида транспорта.
Поиск транспорта рядом с игроком, превращение сетевых id от сервера в локальные сущности, чтение и применение внешнего вида транспорта. Спавн транспорта есть только на сервере (spawnVehicle на странице Транспорт); локальная машина для витрины это PreviewVehicle.
Поиск транспорта
nearestVehicle
Ближайший транспорт на расстоянии от локального игрока. Транспорт, в котором сидит игрок, побеждает первым, если не задан notOwn. Используйте filter, чтобы пропускать неподходящий транспорт, тогда багажник, за которым стоит игрок, победит более близкую машину рядом.
Сторона: Клиент · Ждёт: нет
nearestVehicle(metres: number, options?: { networked?: boolean; notOwn?: boolean; filter?: (vehicle: number) => boolean }): numberlocal 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 | falseLua-аналога нет: 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>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): numberLua-аналога нет: 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): VehiclePropsLua-аналога нет.
Параметры
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): voidLua-аналога нет.
Параметры
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): voidLua-аналога нет.
Параметры
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 }),
);
}Слои через ai-core
medical, appearance, gestures, seatbelt, fuel, mdt, radial, world и inventory - клиентские вызовы, которые достигают того скрипта смерти, одежды, эмоций, ремня, топлива, MDT, радиального меню, погоды или инвентаря, который запущен на сервере.
Замеры и загрузка
raycast, groundZ, locationName, vehicleLabel, waypoint, pedHeadshot, onShot и загрузчики request - вопросы к игре о мире и загрузка игровых ресурсов.