Гаражи
Отправлять транспорт на штрафстоянку и в гараж, открывать меню гаража и получать список транспорта игрока в гаражах через тот скрипт гаражей, который использует сервер.
Вызовы гаражей идут через ai-core, а не через собственные экспорты или события скрипта гаражей (включая ai-garages). ai-core передаёт каждый вызов активному скрипту гаражей: тому, что выбран в настройке панели Garage script, или первому запущенному (ai-garages, jg-advancedgarages, tgiann-realparking и остальные из списка совместимости). Каждый скрипт отвечает только на те действия, которые у него действительно есть, поэтому любое действие может отвечать false или null с одним скриптом и работать с другим.
Транспорт задаётся серверным хэндлом сущности.
GetGarageSystem
Имя ресурса скрипта гаражей, которому ai-core передаёт вызовы.
Сторона: сервер · Ожидание: нет · Библиотека: garages.provider()
GetGarageSystem(): string | nulllocal system = exports['ai-core']:GetGarageSystem() -- string или nilПараметры
Нет.
Возвращает
string | null: имя ресурса скрипта гаражей. null, когда ни один не работает.
Пример
import { addCommand, resourceExport } from "@aicore-fivem/lib/server";
const core = resourceExport("ai-core");
addCommand("garagesystem", { help: "Shows the garage script in use", restricted: true }, () => {
console.log(core.GetGarageSystem() ?? "none");
});ImpoundVehicle
Отправляет транспорт из мира на штрафстоянку. Со скриптами гаражей, у которых есть только форма штрафстоянки на экране игрока, вместо этого открывает эту форму игроку из by.
Сторона: сервер · Ожидание: нет · Библиотека: garages.impound
ImpoundVehicle(vehicle: number, by?: number): booleanlocal taken = exports['ai-core']:ImpoundVehicle(vehicle, source)Параметры
Prop
Type
Возвращает
boolean: true, когда скрипт гаражей забрал транспорт (или открыл свою форму). false, когда ничто его не забрало: ни один скрипт гаражей не работает, у него нет штрафстоянки, это не знакомый ему транспорт или vehicle не является существующим транспортом. При false транспорт всё ещё в мире: удалите его сами, если он должен исчезнуть.
Пример
import { onClientCallback, resourceExport, vehicleNearPlayer } from "@aicore-fivem/lib/server";
import { fail, oneArg, readId } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
onClientCallback("myscript:impound", { args: oneArg(readId) }, (source, netId) => {
if (core.GetDutyJob(source) !== "police") return fail("NOT_POLICE");
const vehicle = vehicleNearPlayer(source, netId, { metres: 5 });
if (!vehicle) return fail("TOO_FAR");
if (!core.ImpoundVehicle(vehicle, source)) DeleteEntity(vehicle);
return { ok: true };
});StoreVehicleInGarage
Ставит транспорт из мира в гараж вместе с его состоянием.
Сторона: сервер · Ожидание: нет · Библиотека: garages.store
StoreVehicleInGarage(vehicle: number, garage?: string | null, by?: number): booleanlocal stored = exports['ai-core']:StoreVehicleInGarage(vehicle, 'legion', source)Параметры
Prop
Type
Возвращает
boolean: true, когда скрипт гаражей принял транспорт. false, когда ничто его не приняло (нет скрипта гаражей, нет действия парковки, неизвестный гараж, транспорт, которым скрипт не владеет) или vehicle не является существующим транспортом.
Пример
import { onClientCallback, resourceExport, vehicleOf } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
// Парковщик ставит машину, которой управляет игрок, в ближайший гараж.
onClientCallback("myscript:valetStore", (source) => {
const vehicle = vehicleOf(source, { driver: true });
if (!vehicle) return fail("NOT_DRIVING");
return core.StoreVehicleInGarage(vehicle, null, source) ? { ok: true } : fail("STORE_FAILED");
});OpenGarage
Открывает игроку меню гаража активного скрипта гаражей.
Сторона: сервер · Ожидание: нет · Библиотека: garages.open
OpenGarage(source: number, garage?: string | null): booleanlocal opened = exports['ai-core']:OpenGarage(source, 'legion')Параметры
Prop
Type
Возвращает
boolean: true, когда меню открылось. false, когда игрока нет в сети, ни один скрипт гаражей не работает или у него нет меню, которое можно открыть извне.
Пример
import { onClientCallback, resourceExport, near } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
const MOTEL_GARAGE = { x: 273.1, y: -343.9, z: 44.9 };
onClientCallback("myscript:motelGarage", { guards: [near(MOTEL_GARAGE, 3)] }, (source) =>
core.OpenGarage(source, "motel") ? { ok: true } : fail("GARAGE_FAILED"),
);GetGaragedVehicles
Транспорт игрока, который хранит скрипт гаражей: в гараже или на штрафстоянке.
Сторона: сервер · Ожидание: нет (отвечает через done) · Библиотека: garages.stored(source) возвращает Promise
GetGaragedVehicles(source: number, done: (vehicles: GaragedVehicle[] | null) => void): voidexports['ai-core']:GetGaragedVehicles(source, function(vehicles) end) -- список или nilПараметры
Prop
Type
Возвращает
Ничего. done получает по записи на каждый транспорт с plate, model (или null), garage (или null) и impounded (GaragedVehicle) или null, когда игрока нет в сети, ни один скрипт гаражей не работает, он не умеет перечислять транспорт или дал сбой. Если done не функция, вызов ничего не делает.
Пример
import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
import type { GaragedVehicle } from "@aicore-fivem/shared";
const core = resourceExport("ai-core");
// Стойка штрафстоянки показывает машины игрока на штрафстоянке.
onClientCallback("myscript:impoundList", async (source) => {
const list = await new Promise<GaragedVehicle[] | null>((resolve) => core.GetGaragedVehicles(source, resolve));
if (!list) return fail("GARAGE_UNKNOWN");
return { ok: true, plates: list.filter((v) => v.impounded).map((v) => v.plate) };
});