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

Внешность

Надеть внешность персонажа на педа, прочитать внешность, которую носит пед, открыть магазин одежды, парикмахерскую или меню нарядов и одеть игрока в рабочую форму, какой бы скрипт одежды ни работал.

Эти экспорты идут через слой внешности ai-core: работу выполняет скрипт одежды, который использует сервер (ai-appearance, tgiann-clothing, illenium-appearance, qb-clothing, crm-appearance, rcore_clothing, bl_appearance). Ваш скрипт никогда не касается собственного формата скрипта одежды, поэтому продолжает работать, когда владелец сервера его меняет.

Внешность (CharacterAppearance) - это { model, data }: хэш модели педа и собственные данные скрипта одежды. Считайте data закрытой коробкой: получайте внешность с сервера (appearance.get(charId) в серверной библиотеке, aiLib.appearance.get в Lua) или из GetPedAppearance и возвращайте её без изменений.

ApplyAppearance

Надевает внешность на педа через активный скрипт одежды. Используйте, чтобы одеть локального педа как персонажа (продавец, похожий на владельца, спящее тело, фото) или чтобы вернуть игроку сохранённую внешность.

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

Сигнатура
ApplyAppearance(ped: number, look: CharacterAppearance): boolean
Lua
local ok = exports['ai-core']:ApplyAppearance(ped, look) -- или aiLib.appearance.apply(ped, look)

Параметры

Prop

Type

Возвращает

boolean: true, когда скрипт одежды получил внешность. false, когда пед не существует, его модель отличается от look.model, внешность не является таблицей { model, data } или не работает ни один скрипт одежды.

Пример

resource/server/index.ts
import { appearance, onClientCallback, resourceExport } from "@aicore-fivem/lib/server";

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

// Собственная сохранённая внешность запросившего игрока.
onClientCallback("myscript:myLook", async (source) => {
  const character = core.GetCharacter(source);
  return character ? await appearance.get(character.id) : null;
});
resource/client/index.ts
import { appearance, requestModel, triggerServerCallback } from "@aicore-fivem/lib/client";
import { toCharacterAppearance } from "@aicore-fivem/shared";

// Локальная копия игрока, стоящая в точке и одетая как он.
export async function spawnLookalike(x: number, y: number, z: number): Promise<number> {
  const look = toCharacterAppearance(await triggerServerCallback("myscript:myLook", []));
  if (!look) return 0;
  await requestModel(look.model);
  const ped = CreatePed(4, look.model, x, y, z, 0, false, false);
  SetModelAsNoLongerNeeded(look.model);
  appearance.apply(ped, look);
  return ped;
}

На собственном педе игрока ApplyAppearance меняет то, что он носит сейчас. Сохраняется ли это изменение, решает скрипт одежды, а не ai-core. Чтобы одеть игрока в форму, которая никогда не сохраняется, используйте WearOutfit.

GetPedAppearance

Возвращает внешность, которую пед носит прямо сейчас, в той же форме { model, data }, что и сохранённые на сервере внешности.

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

Сигнатура
GetPedAppearance(ped: number): CharacterAppearance | null
Lua
local look = exports['ai-core']:GetPedAppearance(ped) -- или aiLib.appearance.read(ped)

Параметры

Prop

Type

Возвращает

CharacterAppearance: model - хэш модели педа, data - данные скрипта одежды. null, когда пед не существует, не работает ни один скрипт одежды или скрипт одежды не может прочитать этого педа (некоторые читают только собственного педа локального игрока).

Пример

resource/client/photo.ts
import { appearance, cache } from "@aicore-fivem/lib/client";

// Копирует то, что игрок носит сейчас, на другого педа той же модели.
export function copyPlayerLook(target: number): boolean {
  const look = appearance.read(cache.ped);
  return look !== null && appearance.apply(target, look);
}

OpenClothingMenu

Открывает для локального игрока одно из меню активного скрипта одежды: магазин одежды, парикмахерскую или сохранённые наряды. Используйте для собственных маркеров магазинов или гардероба в доме.

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

Сигнатура
OpenClothingMenu(menu: ClothingMenu): boolean
Lua
local opened = exports['ai-core']:OpenClothingMenu(menu) -- или aiLib.appearance.openMenu(menu)

Параметры

Возвращает

boolean: true, когда скрипт одежды открыл меню. false для неизвестного menu, когда не работает ни один скрипт одежды или у запущенного нет такого меню.

Пример

resource/client/wardrobe.ts
import { appearance, notify, Points } from "@aicore-fivem/lib/client";
import { Locale } from "common";

const points = new Points();

// Гардероб в номере мотеля.
points.add("motel_wardrobe", {
  coords: { x: 151.3, y: -1001.2, z: -99.0 },
  label: Locale("WARDROBE"),
  onPressed: () => {
    if (!appearance.openMenu("outfits")) notify(Locale("NO_WARDROBE"), "error");
  },
});

WearOutfit

Надевает на локального игрока рабочую форму до вызова ReloadSkin. Меняются только перечисленные вами части; остальная одежда остаётся. Форма никогда не сохраняется как собственная внешность игрока.

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

Сигнатура
WearOutfit(outfit: JobOutfit): boolean
Lua
local ok = exports['ai-core']:WearOutfit(outfit) -- или aiLib.appearance.wearOutfit(outfit)

Параметры

Prop

Type

JobOutfit

Prop

Type

OutfitPiece

См. также OutfitPiece.

Prop

Type

Возвращает

boolean: true, когда скрипт одежды надел форму. false, когда после проверки не осталось ни одной допустимой части, не работает ни один скрипт одежды или запущенный не умеет надевать наряды. Недопустимые части (неверный диапазон id, плохой индекс) отбрасываются по одной; допустимые всё равно надеваются.

Пример

resource/client/locker.ts
import { appearance } from "@aicore-fivem/lib/client";
import type { JobOutfit } from "@aicore-fivem/shared";

// Простая форма из частей базовой игры: рубашка, брюки, обувь, без головного убора.
const UNIFORM: JobOutfit = {
  components: [
    { id: 11, collection: "", index: 55, texture: 0 },
    { id: 4, collection: "", index: 35, texture: 0 },
    { id: 6, collection: "", index: 25, texture: 0 },
  ],
  props: [{ id: 0, collection: "", index: -1, texture: 0 }],
};

export const putOnUniform = (): boolean => appearance.wearOutfit(UNIFORM);
export const takeOffUniform = (): boolean => appearance.reloadSkin();

Индексы drawable отличаются у мужской и женской моделей freemode: держите по наряду на модель и выбирайте его по модели игрока.

ReloadSkin

Возвращает локальному игроку его сохранённую внешность. Используйте, чтобы снять рабочую форму.

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

Сигнатура
ReloadSkin(): boolean
Lua
local ok = exports['ai-core']:ReloadSkin() -- или aiLib.appearance.reloadSkin()

Параметры

Нет.

Возвращает

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

Пример

См. пример WearOutfit.

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