Локальный игрок
Кэшированные пед, транспорт, место и оружие, объект player (позиция, телепорт, анимации), затемнения экрана, педы других игроков и ближайший игрок.
Всё о игроке, сидящем за этим компьютером. Читайте значения из cache вместо вызова PlayerPedId() в циклах: ai-core держит один наблюдатель для всех ресурсов и присылает изменения, поэтому ни один скрипт их не опрашивает.
cache
Самые читаемые значения локального игрока, которые поддерживает в актуальном виде единый наблюдатель ai-core. Как cache в ox_lib: читайте cache.ped вместо вызова PlayerPedId() и cache.vehicle вместо GetVehiclePedIsIn каждый кадр. Чтение ключа это простое чтение из памяти, безопасное в циклах и покадровом коде.
Сторона: Клиент · Ждёт: нет
const cache: PlayerCache // только для чтения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): voidaiLib.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 | falseLua-аналога нет.
Параметры
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(): Vec3local 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(): numberlocal 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): numberlocal 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): voidaiLib.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>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>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(): voidaiLib.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>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>aiLib.fadeIn(ms) -- вызывайте внутри потокаПараметры
Prop
Type
Возвращает
Promise<void>, который выполняется, когда экран чистый, или самое позднее через ms + 2 секунды. Никогда не отклоняется.
Пример
См. fadeOut: они всегда используются вместе.
playerPed
Пед игрока по серверному id. Для локального игрока возвращает cache.ped; для другого игрока возвращает 0, если этот игрок недостаточно близко, чтобы быть подгруженным на этот клиент.
Сторона: Клиент · Ждёт: нет
playerPed(serverId: number): numberlocal 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 | nulllocal 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,
);Связь с сервером
Спросить сервер и дождаться ответа, выполнить серверные действия с переведёнными отказами, слушать события сервера и отвечать на серверные колбэки.
Точки взаимодействия
Points - каждое место, которым пользуется игрок (прилавки, магазины, двери, NPC, банкоматы, багажники транспорта), в виде подсказки или опции target, с педами, блипами и точками, построенными из записей панели.