Ключи автомобиля FiveM: не можешь водить свой автомобиль или заблокировать его? Исправь это

Как работают системы ключей автомобилей в FiveM: списки номерных знаков, выдача ключей после спауна или покупки, блокировка с помощью SetVehicleDoorsLocked и почему вы теряете доступ к своему автомобилю.

Типичные симптомы:

text
You get in your own car: "Vehicle is locked", the engine will not start,
or the key script says you do not have the keys.

Автомобиль, который вчера работал и теперь заблокирован для его владельца, почти всегда проблема со списком ключей, а не ошибка игры. В этой статье объясняется, как работают системы ключей, как выдавать ключи после спауна или покупки и что проверять, когда вы не можете водить свой автомобиль.

Как работает система ключей

Сама игра не имеет ключей. У неё есть только состояние блокировки на каждом автомобиле. Ресурс ключей добавляет остальное:

  1. Он хранит, какие номерные знаки есть у каждого игрока. Номерной знак — это личность автомобиля, так как дескриптор сущности меняется каждый раз при спауне автомобиля.
  2. Он блокирует или разблокирует автомобиль с помощью нативов.
  3. Он блокирует двигатель или дверь для игроков, которые не в списке.

Нативный блокировки находится на клиенте:

lua
-- 1 = unlocked, 2 = locked
SetVehicleDoorsLocked(vehicle, 2)

local status = GetVehicleDoorLockStatus(vehicle)
print(status)

SetVehicleDoorsLocked устанавливает состояние, а GetVehicleDoorLockStatus читает его обратно. Помимо 1 и 2 есть другие состояния, такие как состояние, которое блокирует автомобиль только для игрока. Для простой блокировки и разблокировки вам нужны только эти два.

Совет: блокировка автомобиля не помешает игроку разбить окно или вытянуть водителя из незаблокированной машины NPC. Всё остальное, помимо состояния блокировки, зависит от скрипта ключей.

Кто владеет списком

Место, где живёт список, определяет, что ломается после перезагрузки:

  • Только память. Список восстанавливается, когда игрок присоединяется, из автомобилей, которыми они владеют в базе данных. Если скрипт перезагружается во время игры, список пуст до переподключения.
  • База данных или на основе элемента. Ключи — это предметы в инвентаре, с номерным знаком в метаданных предмета. Ключ выживает перезагрузку, но изменённый номерной знак его разбивает.
  • Проверка владельца. Скрипт сравнивает идентификатор игрока с владельцем номерного знака в owned_vehicles (ESX) или player_vehicles (QBCore и QBox). Отдельный список не существует.

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

Выдача ключей после спауна или покупки

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

  1. Создайте автомобиль.
  2. Установите номерной знак с помощью SetVehicleNumberPlateText.
  3. Вызовите экспорт или событие ресурса ключей с этим номерным знаком.
lua
local vehicle = CreateVehicle(model, coords.x, coords.y, coords.z, heading, true, false)
SetVehicleNumberPlateText(vehicle, plate)

-- the name of this call depends on your key resource: check its documentation
exports['your_key_resource']:GiveKeys(plate)

your_key_resource и GiveKeys — это заполнители. Реальное имя находится в документации используемого вами ресурса. Если это событие, одно и то же правило применяется: передайте номерной знак, а не дескриптор сущности.

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

Взлом и горячее запуск

Это функции скрипта ключей, а не игры. Обычная логика:

  • Игрок, который не в списке ключей, пытается войти в заблокированный автомобиль. Скрипт выполняет проверку навыка или полоску прогресса.
  • При успехе он разблокирует автомобиль с помощью SetVehicleDoorsLocked(vehicle, 1). Для горячего запуска он также позволяет двигателю запуститься для этого сеанса, обычно помня номерной знак во временном списке.
  • При неудаче это может предупредить полицию или сломать инструмент.

Если вы строите своего собственного, держите решение о результате на сервере. Клиент, который самостоятельно решает, разрешено ли ему разблокировать любой автомобиль, может быть использован с помощью меню мода.

Невозможно водить свой автомобиль

Пройдите через эти причины по очереди:

Список ключей был потерян. Перезагрузка скрипта, сбой или refresh; restart ресурса ключей опустошает список, основанный на памяти. Переподключитесь или активируйте собственное обновление скрипта.

Номерной знак изменился. Номерной знак хранится в трёх местах: автомобиль в игре, список ключей или предмет ключа и строка базы данных. Если скрипт изменяет один из них (средство смены номерного знака, поддельный предмет номерного знака, скрипт настройки), остальные перестают совпадать. Сравните номерной знак на экране с номерным знаком в таблице:

sql
SELECT owner, plate FROM owned_vehicles WHERE plate LIKE '%MIC%';

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

Неправильный владелец. Строка имеет старый идентификатор или citizenid, поэтому проверка владельца не удаётся. Это та же причина, что и автомобиль, отсутствующий в гараже.

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

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

Быстрая проверка в игре

Если вы сомневаетесь в самом состоянии блокировки, прочитайте его с клиента:

lua
RegisterCommand('lockstate', function()
    local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
    if vehicle == 0 then return end
    print('lock status', GetVehicleDoorLockStatus(vehicle), GetVehicleNumberPlateText(vehicle))
end, false)

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

Чеклист

Симптом Исправление
Заблокирован после перезагрузки Список ключей находится в памяти: переподключитесь или позвольте скрипту восстановить его из собственных автомобилей
Спауненный автомобиль заблокирован для вас Вызовите экспорт или событие ресурса ключей с номерным знаком после SetVehicleNumberPlateText
Автомобиль куплен, но нет ключей Выдайте ключи во время покупки и сохраните один и тот же номерной знак в базе данных
Ключи перестали работать после смены номерного знака Обновите номерной знак в игре, в списке ключей и в базе данных вместе
Номерной знак выглядит правильно, но не совпадает Проверьте пробелы и регистр букв, используйте один формат везде
Состояние двери 1, но двигатель остаётся выключен Скрипт ключей блокирует двигатель: проверьте его список, а не блокировку
Автомобиль переключается между заблокированным и разблокированным Два скрипта ключей работают: удалите один

Короткие ответы

Почему я не могу водить свой автомобиль после перезагрузки?

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

Как я выдаю ключи от автомобиля, который я спауню со своим собственным скриптом?

Вызовите экспорт или событие вашего ресурса ключей с помощью номерного знака после установки номерного знака. Каждый скрипт ключей называет этот вызов по-разному, поэтому прочитайте его документацию вместо копирования вызова с другого сервера.

Разбивает ли изменение номерного знака мои ключи?

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

Скрипты без этой проблемы

Advanced BoostingУгон машин на заказ через планшет: контракты от класса D до S+, команды и живая очередь.Смотреть скрипт →Car BombЗакладывайте, находите и обезвреживайте бомбы в машинах — с телефоном-детонатором и мини-игрой C4.Смотреть скрипт →Chameleon Paints82 краски-хамелеона с переливом цвета в одном меню — наносятся в один клик.Смотреть скрипт →

Читайте также