AI Core
Справочник APIКлиентские экспорты ai-core

Игрок

Прочитать персонажа, деньги, работы, дежурство и банды локального игрока, проверить, загружен ли персонаж, и прочитать определения работ и банд.

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

В TypeScript используйте getPlayerData(key) и onPlayerData(key, handler) из библиотеки вместо того, чтобы снова и снова вызывать GetPlayerData. В Lua используйте aiLib.playerData.get(key) и aiLib.playerData.onChange(key, handler). Они читают экспорт один раз, а затем следят за каждым изменением, которое присылает ai-core.

GetPlayerData

Возвращает всё, что ai-core знает о загруженном персонаже локального игрока, одной таблицей: персонаж, деньги, работы, дежурство, основная работа, банды, активная банда и метаданные. Используйте, чтобы прочитать данные один раз при старте ресурса; за изменениями следите через onPlayerData (TS) или aiLib.playerData.onChange (Lua).

Сторона: клиент · Ожидание: нет

Сигнатура
GetPlayerData(): AiPlayerData | null
Lua
local data = exports['ai-core']:GetPlayerData() -- table или nil

Параметры

Нет.

Возвращает

AiPlayerData, пока персонаж находится в мире, null (nil в Lua) на экране персонажей, до загрузки первого персонажа и после того, как игрок вернулся на экран персонажей.

Prop

Type

Пример

resource/client/index.ts
import { getPlayerData, onPlayerData } from "@aicore-fivem/lib/client";

// Показывает метку только для полиции, пока игрок на дежурстве в полиции.
let blip = 0;

function updateBlip(duty: string | null): void {
  if (duty === "police" && blip === 0) {
    blip = AddBlipForCoord(441.8, -982.0, 30.7); // Полицейский участок Mission Row
    SetBlipSprite(blip, 60);
  } else if (duty !== "police" && blip !== 0) {
    RemoveBlip(blip);
    blip = 0;
  }
}

// Прочитать один раз (библиотека сама вызывает GetPlayerData из ai-core), затем следить за каждым изменением.
updateBlip(getPlayerData("duty") ?? null);
onPlayerData("duty", (duty) => updateBlip(duty));

Это собственная копия игрока, чтобы показывать что-то на экране. Никогда не принимайте на её основе решений, которым должен доверять сервер (платёж, предмет, доступ к тайнику): сервер проверяет заново своими экспортами.

IsPlayerLoaded

Сообщает, находится ли персонаж в мире на этом клиенте. Используйте перед запуском всего, чему нужен персонаж (HUD, рабочий цикл), если ваш ресурс может стартовать после того, как игрок уже загрузился.

Сторона: клиент · Ожидание: нет

Сигнатура
IsPlayerLoaded(): boolean
Lua
local loaded = exports['ai-core']:IsPlayerLoaded() -- boolean

Параметры

Нет.

Возвращает

boolean: true с момента, когда персонаж помещён в мир, false на экране персонажей, пока игрок выбирает точку появления, и после того, как он вернулся на экран персонажей.

Пример

resource/client/index.ts
import { resourceExport } from "@aicore-fivem/lib/client";
import { CORE } from "@aicore-fivem/shared";

const core = resourceExport("ai-core");

function start(): void {
  console.log("character ready, starting the job loop");
}

// Игрок мог загрузиться до старта этого ресурса (перезапуск): сначала проверить, затем слушать.
if (core.IsPlayerLoaded()) start();
on(CORE.clientPlayerLoadedEvent, start);

GetDefinitions

Возвращает все работы или все банды в том виде, в каком их хранит админ-панель (названия, ранги и остальные поля, которые редактирует панель). Мосты фреймворков используют это, чтобы собирать таблицы работ ESX / QB. Прочитайте один раз, затем следите за клиентским событием ai-core:client:definitions, которое срабатывает для каждой работы или банды, изменённой в панели.

Сторона: клиент · Ожидание: нет

Сигнатура
GetDefinitions(file: "jobs" | "gangs"): Record<string, unknown> | null
Lua
local jobs = exports['ai-core']:GetDefinitions('jobs') -- таблица с ключами по имени работы, или nil

Параметры

Prop

Type

Возвращает

Record<string, unknown>: по записи на каждую работу или банду с ключом по её имени (police, ambulance). Записи - это собственные данные панели, и они не проверяются. null, когда file не равен ни "jobs", ни "gangs".

Пример

resource/client/index.ts
import { resourceExport } from "@aicore-fivem/lib/client";
import { CORE } from "@aicore-fivem/shared";

const core = resourceExport("ai-core");

// Локальная копия всех работ, всегда актуальная.
const jobs: Record<string, unknown> = { ...(core.GetDefinitions("jobs") ?? {}) };

on(CORE.clientDefinitionsEvent, (file: string, name: string, definition: unknown) => {
  if (file !== "jobs") return;
  if (definition === null) delete jobs[name];
  else jobs[name] = definition;
});

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

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