AI Core
Справочник APIAI Core: серверные экспорты

Гаражи

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

Вызовы гаражей идут через ai-core, а не через собственные экспорты или события скрипта гаражей (включая ai-garages). ai-core передаёт каждый вызов активному скрипту гаражей: тому, что выбран в настройке панели Garage script, или первому запущенному (ai-garages, jg-advancedgarages, tgiann-realparking и остальные из списка совместимости). Каждый скрипт отвечает только на те действия, которые у него действительно есть, поэтому любое действие может отвечать false или null с одним скриптом и работать с другим.

Транспорт задаётся серверным хэндлом сущности.

GetGarageSystem

Имя ресурса скрипта гаражей, которому ai-core передаёт вызовы.

Сторона: сервер · Ожидание: нет · Библиотека: garages.provider()

Сигнатура
GetGarageSystem(): string | null
Lua
local 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): boolean
Lua
local 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): boolean
Lua
local 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): boolean
Lua
local 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): void
Lua
exports['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) };
});

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