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

Локальный игрок

Кэшированные пед, транспорт, место и оружие, объект player (позиция, телепорт, анимации), затемнения экрана, педы других игроков и ближайший игрок.

Всё о игроке, сидящем за этим компьютером. Читайте значения из cache вместо вызова PlayerPedId() в циклах: ai-core держит один наблюдатель для всех ресурсов и присылает изменения, поэтому ни один скрипт их не опрашивает.

cache

Самые читаемые значения локального игрока, которые поддерживает в актуальном виде единый наблюдатель ai-core. Как cache в ox_lib: читайте cache.ped вместо вызова PlayerPedId() и cache.vehicle вместо GetVehiclePedIsIn каждый кадр. Чтение ключа это простое чтение из памяти, безопасное в циклах и покадровом коде.

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

Сигнатура
const cache: PlayerCache // только для чтения
Lua
local ped = aiLib.cache.ped

Ключи

Prop

Type

Тип: PlayerCache.

Пример

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

// Скорость, показываемая во время вождения, читается из кэша каждые 200 мс.
every(200, () => {
  if (cache.vehicle === false || cache.seat !== -1) return;
  const kmh = GetEntitySpeed(cache.vehicle) * 3.6;
  SendNUIMessage({ action: "speed", data: Math.round(kmh) });
});

cache.ped отстаёт от смены модели до 100 мс. Сразу после смены модели (SetPlayerModel) один раз вызовите PlayerPedId(). Действия player ниже уже читают педа заново.

onCache

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

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

Сигнатура
onCache<K extends keyof PlayerCache>(key: K, handler: (value: PlayerCache[K], old: PlayerCache[K]) => void): void
Lua
aiLib.cache.onChange(key, function(value, old) end)

Параметры

Prop

Type

Возвращает

void. Удалить обработчик нельзя; держите по одному на функцию в начале файла.

Пример

import { onCache, inventory, Points } from "@aicore-fivem/lib/client";

const points = new Points();

// Точки, canShow которых читает cache.vehicle, проверяются снова.
onCache("vehicle", () => points.refresh());

// Предмет оружия в руках, читается только при смене оружия.
onCache("weapon", (weapon) => {
  const item = weapon === false ? null : inventory.currentWeapon();
  SendNUIMessage({ action: "weapon", data: item });
});

readPlayerState

Читает транспорт, место и оружие педа прямо сейчас, без кэша. Его использует наблюдатель ai-core; вам он нужен только для педа, который не является локальным, или чтобы вручную сравнить с кэшем.

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

Сигнатура
readPlayerState(ped: number): { vehicle: number | false; seat: number | false; weapon: number | false }

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

Параметры

Prop

Type

Возвращает

Объект с vehicle (хэндл транспорта, false, если пешком), seat (-1 водитель и выше, false, если пешком) и weapon (хэш в руках, false, если безоружен).

Пример

import { playerPed, readPlayerState } from "@aicore-fivem/lib/client";

const ped = playerPed(12);
if (ped !== 0 && readPlayerState(ped).seat === -1) console.log("player 12 is driving");

readWeapon

Оружие в руке педа прямо сейчас, false, если безоружен.

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

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

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

Параметры

Prop

Type

Возвращает

number | false: хэш оружия или false, если пед держит WEAPON_UNARMED.

Пример

import { nearestPlayer, playerPed, readWeapon } from "@aicore-fivem/lib/client";

const id = nearestPlayer(5);
if (id !== null && readWeapon(playerPed(id)) !== false) console.log("the player next to you is armed");

player

Один объект для локального педа: где он, перемещение, анимации. Чтение использует cache.ped; действия читают педа заново, поэтому работают и сразу после смены модели.

player.ped

Хэндл локального педа (то же значение, что cache.ped).

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

Сигнатура
player.ped: number // свойство только для чтения

Lua-аналога нет: используйте aiLib.cache.ped.

Возвращает

number: хэндл педа.

Пример

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

SetPedArmour(player.ped, 100);

player.coords

Позиция педа сейчас.

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

Сигнатура
player.coords(): Vec3
Lua
local coords = aiLib.player.coords() -- vector3

Возвращает

Vec3 { x, y, z } в TypeScript (z это корень педа, примерно на 1 м выше пола). Lua возвращает vector3.

Пример

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

const here = player.coords();
console.log(`${locationName(here).street} at ${here.x.toFixed(1)}, ${here.y.toFixed(1)}`);

player.heading

Направление, в котором смотрит пед, в градусах (0-360, 0 = север).

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

Сигнатура
player.heading(): number
Lua
local heading = aiLib.player.heading()

Возвращает

number: направление в градусах.

Пример

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

// Сохраняем место и направление для записи панели.
const spot = { ...player.coords(), heading: player.heading() };

player.distanceTo

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

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

Сигнатура
player.distanceTo(point: Vec3): number
Lua
local metres = aiLib.player.distanceTo(point) -- vector3 или { x, y, z }

Параметры

Prop

Type

Возвращает

number: метры, измеренные в 3D.

Пример

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

const counter = { x: 25.7, y: -1347.3, z: 29.5 };
if (player.distanceTo(counter) > 3) notify("Walk to the counter first", "error");

player.freeze

Замораживает педа на месте или снова позволяет ему двигаться.

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

Сигнатура
player.freeze(state: boolean): void
Lua
aiLib.player.freeze(frozen)

Параметры

Prop

Type

Возвращает

void.

Пример

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

player.freeze(true);
setTimeout(() => player.freeze(false), 5000);

player.teleport

Перемещает игрока и ждёт, пока загрузится мир вокруг нового места, за затемнением экрана. Без z (или с ground: "find") ищет землю под x и y: используйте это для метки на карте.

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

Сигнатура
player.teleport(to: { x: number; y: number; z?: number }, options?: TeleportOptions): Promise<void>
Lua
aiLib.player.teleport(to, options) -- вызывайте внутри потока

Параметры

Prop

Type

TeleportOptions

Prop

Type

Возвращает

Promise<void>, который выполняется, как только игрок стоит на новом месте и коллизия там загрузилась (или через 5 секунд без неё). Lua ничего не возвращает.

Пример

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

RegisterCommand(
  "tpm",
  async () => {
    const target = waypoint();
    if (!target) return notify("Set a waypoint first", "error");
    await player.teleport(target, { keepVehicle: true }); // без z: приземляется на землю
  },
  false,
);

Поиск земли в TypeScript ставит замороженного педа на растущие высоты, ждёт коллизию на каждой и пропускает поверхности внутри интерьеров MLO или IPL, поэтому никогда не приземляется на крышу или внутрь здания над улицей. Версия для Lua берёт первую найденную землю и ждёт коллизию не более 3 секунд.

player.playAnim

Проигрывает анимацию на педе. Сначала загружает словарь анимаций.

Сторона: Клиент · Ждёт: да в TypeScript (выполняется, когда анимация началась); в Lua приостанавливает поток, пока загружается словарь

Сигнатура
player.playAnim(dict: string, clip: string, options?: AnimOptions): Promise<void>
Lua
aiLib.player.playAnim(dict, clip, options) -- вызывайте внутри потока

Параметры

Prop

Type

AnimOptions

Prop

Type

Возвращает

Promise<void>, который выполняется, когда анимация началась. Он отклоняется, если словаря не существует или он не загрузился за 10 секунд. Lua ничего не возвращает и ничего не делает, если словарь не загрузился.

Пример

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

export async function handOver(): Promise<void> {
  await player.playAnim("mp_common", "givetake1_a", { flag: 48, duration: 1500 });
}

player.stopAnim

Останавливает всё, что делает пед (ClearPedTasks): анимации и сценарии.

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

Сигнатура
player.stopAnim(): void
Lua
aiLib.player.stopAnim()

Возвращает

void.

Пример

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

export async function readClipboard(): Promise<void> {
  await player.playAnim("amb@world_human_clipboard@male@idle_a", "idle_c");
  setTimeout(() => player.stopAnim(), 4000);
}

player.holdAnim

Поддерживает проигрывание анимации, пока вы её не остановите, возвращая её, когда её прерывает падение или толчок. Описано вместе с пропами на странице Педы, блипы и пропы.

Затемнения и другие игроки

fadeOut

Затемняет экран до чёрного и ждёт, пока он станет полностью чёрным. Используйте, чтобы скрыть телепорт, смену модели или смену сцены.

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

Сигнатура
fadeOut(ms?: number): Promise<void>
Lua
aiLib.fadeOut(ms) -- вызывайте внутри потока

Параметры

Prop

Type

Возвращает

Promise<void>, который выполняется, когда экран чёрный, или самое позднее через ms + 2 секунды. Никогда не отклоняется.

Пример

import { fadeIn, fadeOut } from "@aicore-fivem/lib/client";

export async function moveToSquare(): Promise<void> {
  await fadeOut();
  SetEntityCoords(PlayerPedId(), -269.4, -955.3, 31.2, false, false, false, false);
  await fadeIn();
}

fadeIn

Возвращает изображение на экран и ждёт, пока он станет чистым. Пара к fadeOut.

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

Сигнатура
fadeIn(ms?: number): Promise<void>
Lua
aiLib.fadeIn(ms) -- вызывайте внутри потока

Параметры

Prop

Type

Возвращает

Promise<void>, который выполняется, когда экран чистый, или самое позднее через ms + 2 секунды. Никогда не отклоняется.

Пример

См. fadeOut: они всегда используются вместе.

playerPed

Пед игрока по серверному id. Для локального игрока возвращает cache.ped; для другого игрока возвращает 0, если этот игрок недостаточно близко, чтобы быть подгруженным на этот клиент.

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

Сигнатура
playerPed(serverId: number): number
Lua
local ped = aiLib.playerPed(serverId)

Параметры

Prop

Type

Возвращает

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

Пример

import { onServerEvent, playerPed } from "@aicore-fivem/lib/client";

// Сервер сообщает всем рядом, что на игрока надели наручники.
onServerEvent(
  "myscript:cuffed",
  { args: ([id]) => (typeof id === "number" ? [id] : null) },
  (id) => {
    const ped = playerPed(id);
    if (ped !== 0) SetEnableHandcuffs(ped, true);
  },
);

Никогда не используйте GetPlayerPed(-1) или GetPlayerPed(GetPlayerFromServerId(id)) вручную: неизвестный id даёт -1, а GetPlayerPed(-1) это локальный пед, поэтому действие попадёт не в того игрока.

nearestPlayer

Ближайший другой игрок на расстоянии, в виде серверного id. Перебирает только игроков, подгруженных на этот клиент. Используйте, чтобы выбрать цель действий передать, обыскать, надеть наручники или повалить, затем отправьте этот id на сервер, который снова проверит расстояние.

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

Сигнатура
nearestPlayer(metres: number, options?: { from?: Vec3; filter?: (serverId: number, ped: number) => boolean }): number | null
Lua
local serverId = aiLib.nearestPlayer(metres, options) -- integer или nil

Параметры

Prop

Type

Опции

Prop

Type

Возвращает

number | null: серверный id ближайшего игрока, прошедшего filter, или null (nil в Lua), если никого нет в пределах metres. Локальный игрок никогда не возвращается.

Пример

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

RegisterCommand(
  "givecash",
  async (_src: number, args: string[]) => {
    const target = nearestPlayer(3, { filter: (_id, ped) => !IsPedInAnyVehicle(ped, false) });
    if (target === null) return notify("Nobody is close enough", "error");
    await callAction("myscript:give", [target, Number(args[0])], { fallback: "GIVE_FAILED" });
  },
  false,
);

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