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

Ключи от транспорта

Выдавать, забирать и проверять ключи от транспорта через тот скрипт ключей, который использует сервер.

Каждый вызов ключей идёт через ai-core, а не через собственные экспорты скрипта ключей (включая ai-vehiclekeys). ai-core передаёт его активной системе ключей: той, что выбрана в настройке панели Key script, или первой запущенной. Когда ни один скрипт ключей не работает, каждый игрок считается владельцем всех ключей.

Транспорт задаётся либо серверным хэндлом сущности (число, которое возвращает CreateVehicleServerSetter или spawnVehicle), либо текстом номера. Номер сначала обрезается по краям и переводится в верхний регистр, поэтому " ab12cde " и "AB12CDE" - один и тот же ключ.

У каждого ключа есть назначение, которое сообщает системе ключей, зачем игрок его получает. Некоторые системы ключей обрабатывают их по-разному (купленный транспорт получает новый предмет-ключ, рабочий транспорт - ключ, закреплённый в замке зажигания). См. KeyPurpose.

НазначениеКогда
purchaseИгрок теперь владеет транспортом (автосалон, выдача админом): новый ключ, старые копии перестают работать.
garageЛичный транспорт, взятый со стоянки: у владельца ключ уже есть.
jobРабочий транспорт на смену.
rentalАрендованный транспорт на время аренды.
temporaryВсё остальное кратковременное (спавн админом, тест-драйв, транспорт для ограбления). По умолчанию.

GiveVehicleKeys

Выдаёт игроку ключи от транспорта.

Сторона: сервер · Ожидание: нет · Библиотека: vehicleKeys.give (а spawnVehicle({ keysTo, purpose }) выдаёт их за вас)

Сигнатура
GiveVehicleKeys(source: number, vehicle: number | string, purpose?: KeyPurpose): void
Lua
exports['ai-core']:GiveVehicleKeys(source, vehicle, 'rental')

Параметры

Prop

Type

Возвращает

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

Пример

import { onClientCallback, resourceExport, spawnVehicle } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const core = resourceExport("ai-core");
const SPAWN = { x: -1023.5, y: -2694.1, z: 13.9, heading: 150 };

onClientCallback("myscript:rentScooter", { lock: true }, async (source) => {
  if (!core.RemoveMoney(source, "cash", 100, "scooter_rental")) return fail("NOT_ENOUGH_MONEY");
  const vehicle = await spawnVehicle({ model: "faggio", coords: SPAWN, asker: source });
  if (!vehicle) {
    core.AddMoney(source, "cash", 100, "scooter_rental_refund");
    return fail("SPAWN_FAILED");
  }
  core.GiveVehicleKeys(source, vehicle, "rental");
  return { ok: true };
});

У только что созданного транспорта на сервере нет номера, пока клиент-владелец его не синхронизирует. Передавайте сущность, а не номер, прочитанный сразу после создания; spawnVehicle из библиотеки ждёт номер и может сам выдать ключи (keysTo, purpose).

RemoveVehicleKeys

Забирает у игрока ключи от транспорта.

Сторона: сервер · Ожидание: нет · Библиотека: vehicleKeys.remove

Сигнатура
RemoveVehicleKeys(source: number, vehicle: number | string): void
Lua
exports['ai-core']:RemoveVehicleKeys(source, 'AB12CDE')

Параметры

Prop

Type

Возвращает

Ничего. Те же молчаливые случаи, что и у GiveVehicleKeys.

Пример

import { resourceExport } from "@aicore-fivem/lib/server";

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

/** The rental ended: the keys go, then the scooter. */
export function endRental(source: number, vehicle: number): void {
  core.RemoveVehicleKeys(source, vehicle);
  if (DoesEntityExist(vehicle)) DeleteEntity(vehicle);
}

Забирайте ключи до удаления транспорта. Некоторые системы ключей читают номер из сущности, а это не удаётся, когда её уже нет.

HasVehicleKeys

Есть ли у игрока ключи от транспорта.

Сторона: сервер · Ожидание: нет · Библиотека: vehicleKeys.has

Сигнатура
HasVehicleKeys(source: number, vehicle: number | string): boolean
Lua
local has = exports['ai-core']:HasVehicleKeys(source, vehicle)

Параметры

Prop

Type

Возвращает

boolean: true, когда у игрока есть ключи. Также true, когда ни одна система ключей не работает, когда система ключей не может ответить на этот вопрос или когда она даёт сбой, поэтому отсутствующий скрипт ключей никогда не блокирует игроков. false, когда у игрока нет ключа, сущность транспорта не существует, номер пуст или source не число.

Пример

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:openTrunk", { args: oneArg(readId) }, (source, netId) => {
  const vehicle = vehicleNearPlayer(source, netId, { metres: 4 });
  if (!vehicle) return fail("TOO_FAR");
  if (!core.HasVehicleKeys(source, vehicle)) return fail("NO_KEYS");
  return { ok: true };
});

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