Игрок
Прочитать персонажа, деньги, работы, дежурство и банды локального игрока, проверить, загружен ли персонаж, и прочитать определения работ и банд.
Эти экспорты читают то, что 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 | nulllocal data = exports['ai-core']:GetPlayerData() -- table или nilПараметры
Нет.
Возвращает
AiPlayerData, пока персонаж находится в мире, null (nil в Lua) на экране персонажей, до загрузки первого персонажа и после того, как игрок вернулся на экран персонажей.
Prop
Type
Пример
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(): booleanlocal loaded = exports['ai-core']:IsPlayerLoaded() -- booleanПараметры
Нет.
Возвращает
boolean: true с момента, когда персонаж помещён в мир, false на экране персонажей, пока игрок выбирает точку появления, и после того, как он вернулся на экран персонажей.
Пример
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> | nulllocal jobs = exports['ai-core']:GetDefinitions('jobs') -- таблица с ключами по имени работы, или nilПараметры
Prop
Type
Возвращает
Record<string, unknown>: по записи на каждую работу или банду с ключом по её имени (police, ambulance). Записи - это собственные данные панели, и они не проверяются. null, когда file не равен ни "jobs", ни "gangs".
Пример
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 или серверную библиотеку; ранги проверяет именно сервер.