Внешность
Надеть внешность персонажа на педа, прочитать внешность, которую носит пед, открыть магазин одежды, парикмахерскую или меню нарядов и одеть игрока в рабочую форму, какой бы скрипт одежды ни работал.
Эти экспорты идут через слой внешности 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): booleanlocal ok = exports['ai-core']:ApplyAppearance(ped, look) -- или aiLib.appearance.apply(ped, look)Параметры
Prop
Type
Возвращает
boolean: true, когда скрипт одежды получил внешность. false, когда пед не существует, его модель отличается от look.model, внешность не является таблицей { model, data } или не работает ни один скрипт одежды.
Пример
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;
});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 | nulllocal look = exports['ai-core']:GetPedAppearance(ped) -- или aiLib.appearance.read(ped)Параметры
Prop
Type
Возвращает
CharacterAppearance: model - хэш модели педа, data - данные скрипта одежды. null, когда пед не существует, не работает ни один скрипт одежды или скрипт одежды не может прочитать этого педа (некоторые читают только собственного педа локального игрока).
Пример
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): booleanlocal opened = exports['ai-core']:OpenClothingMenu(menu) -- или aiLib.appearance.openMenu(menu)Параметры
Prop
Type
Возвращает
boolean: true, когда скрипт одежды открыл меню. false для неизвестного menu, когда не работает ни один скрипт одежды или у запущенного нет такого меню.
Пример
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): booleanlocal ok = exports['ai-core']:WearOutfit(outfit) -- или aiLib.appearance.wearOutfit(outfit)Параметры
Prop
Type
JobOutfit
Prop
Type
OutfitPiece
См. также OutfitPiece.
Prop
Type
Возвращает
boolean: true, когда скрипт одежды надел форму. false, когда после проверки не осталось ни одной допустимой части, не работает ни один скрипт одежды или запущенный не умеет надевать наряды. Недопустимые части (неверный диапазон id, плохой индекс) отбрасываются по одной; допустимые всё равно надеваются.
Пример
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(): booleanlocal ok = exports['ai-core']:ReloadSkin() -- или aiLib.appearance.reloadSkin()Параметры
Нет.
Возвращает
boolean: true, когда скрипт одежды получил запрос на перезагрузку внешности. false, когда не работает ни один скрипт одежды или запущенный не умеет перезагружать.
Пример
См. пример WearOutfit.
Жесты и эмоции
Проверить поднятые руки и указание пальцем, проиграть и остановить эмоцию по имени и узнать, какой скрипт эмоций отвечает, какое бы меню эмоций ни использовал сервер.
Медицина
Узнать, лежит ли локальный игрок (мёртв или в состоянии last stand), какой бы скрипт смерти ни использовал сервер.