Гараж FiveM: owned_vehicles и player_vehicles, отсутствующие машины исправлены
Машины отсутствуют в гараже? Как работают таблицы ESX owned_vehicles и QBCore player_vehicles, сохраненные и столбцы состояния, и SQL для исправления машин, застрявших снаружи.
Типичные симптомы:
You bought a car, and the garage says "No vehicles". Or the car was parked at the street, the server restarted, and it is gone.Почти каждый скрипт гаража читает то же самое: одна таблица с одной строкой за принадлежащее транспортное средство. Когда машина отсутствует, строка неправильна, а не скрипт. Эта статья объясняет две стандартные таблицы, что означают сохраненные и столбцы состояния, и SQL, который исправляет обычные случаи.
Две таблицы
ESX использует owned_vehicles. QBCore и QBox используют player_vehicles. Имена одинаковые на серверах, точные столбцы зависят от вашей версии и вашего скрипта гаража, поэтому сначала посмотрите вашу:
DESCRIBE owned_vehicles;
DESCRIBE player_vehicles;ESX: owned_vehicles
Основные столбцы в ESX Legacy:
| Столбец | Содержание |
|---|---|
owner |
Идентификатор игрока ESX |
plate |
Номер, уникальный за машину |
vehicle |
JSON текст со свойствами транспортного средства |
type |
car, boat, aircraft... |
stored |
1 в гараже, 0 в мире |
job |
Установлен для рабочих транспортных средств, иначе пусто |
Скрипты гаража добавляют свои собственные столбцы, например для названия гаража или состояния фунта.
QBCore и QBox: player_vehicles
| Столбец | Содержание |
|---|---|
citizenid |
Персонаж, который владеет машиной |
license |
Идентификатор лицензии игрока |
vehicle |
Имя модели |
hash |
Хеш модели |
mods |
JSON текст со свойствами транспортного средства |
plate |
Номер |
garage |
ID гаража, которому принадлежит машина |
state |
0 снаружи, 1 в гараже, 2 конфискована |
fuel, engine, body |
Последние сохраненные значения |
QBox использует ту же таблицу с теми же идеями. Другие столбцы, такие как финансовые данные, различаются.
Свойства как JSON
Столбец vehicle на ESX и столбец mods на QBCore содержат внешний вид и настройку машины как JSON: цвета, моды, колеса, номер и так далее. Гараж читает это, когда вы выводите машину, и пишет это снова, когда вы ее паркуете.
-- when storing, on the client
local props = lib.getVehicleProperties(vehicle)
TriggerServerEvent('my_garage:store', plate, json.encode(props))JSON должна быть действительна. Если скрипт написал сломанную строку, машина не может быть восстановлена и спавнится обычная или вообще не спавнится. Статья о vehicle properties показывает, как построить и применить их.
Транспортные средства отсутствуют в гараже
Запустите эти по порядку.
1. Строка существует, но принадлежит кому-то еще
Список гаража фильтруется по владельцу. Если значение владельца не то, которое использует сервер для вашего персонажа, строка невидима:
SELECT owner, plate, stored FROM owned_vehicles WHERE plate = 'MIC 001';SELECT citizenid, license, plate, state FROM player_vehicles WHERE plate = 'MIC 001';Сравните владельца с вашим реальным персонажем:
- ESX: идентификатор в
users.identifierдля этого персонажа. С многопласштным скриптом он может иметь префикс, такой какchar1:, и машина, купленная до установки мультиперсонажа, имеет старое значение без него. - QBCore и QBox:
citizenidв таблицеplayers.
После изменения фреймворка, импорта с другого сервера или ручной вставки это наиболее распространенная причина. Исправьте это, направив строку на правильное значение:
UPDATE owned_vehicles SET owner = 'char1:abcdef...' WHERE plate = 'MIC 001';
UPDATE player_vehicles SET citizenid = 'ABC12345' WHERE plate = 'MIC 001';Замените значения на реальные из ваших таблиц.
2. Состояние застряло "снаружи"
Машина, которую вы вывели и которая никогда не вернулась, например после краша или перезагрузки, остается помеченной как снаружи. Гараж перечисляет только припаркованные машины.
ESX, установите сохраненный флаг обратно:
UPDATE owned_vehicles SET `stored` = 1 WHERE `stored` = 0;QBCore и QBox, установите состояние на garaged:
UPDATE player_vehicles SET state = 1 WHERE state = 0;Внимание: на живом сервере это также хранит машины, на которых игроки ездят прямо сейчас. Запустите это при запуске, или ограничьте это
WHEREна один номер или одного владельца.
Многие серверы запускают очистку подобно этому автоматически, когда ресурс запускается, так как после перезагрузки машина не может быть снаружи. Если ваш не запускает, вы можете сделать это сами:
-- server side, runs when the garage resource starts
AddEventHandler('onResourceStart', function(resource)
if resource ~= GetCurrentResourceName() then return end
MySQL.update('UPDATE player_vehicles SET state = 1 WHERE state = 0')
end)Обратите внимание на обратные кавычки вокруг stored в запросе ESX: stored — зарезервированное слово в MySQL и не работает без них. Некоторые скрипты затем отправляют эти машины в состояние фунта вместо гаража, поэтому проверьте, что ожидает ваш гараж.
3. ID гаража не совпадает
На QBCore столбец garage говорит, в каком гараже живет машина. Гараж, названный в вашем конфиге, который не в строке, или переименованный гараж, не показывает ничего. Перечислите используемые значения:
SELECT garage, COUNT(*) FROM player_vehicles GROUP BY garage;Установите машины в гараж, который существует в вашем конфиге.
4. Тип машины не совпадает
Скрипты гаража разделяют машины, лодки и самолеты по столбцу type или классу транспортного средства. Лодка, сохраненная как car, никогда не показывается в гараже лодок.
Номера
Номер связывает мир, базу данных и ключи. Держите эти правила:
- Номер уникален за строку. Дубликат вызывает загрузку неправильной машины.
- Номер не более 8 символов в игре, столбец может быть длиннее на ESX.
- Пробелы считаются.
MIC 001иMIC001— два номера, поэтому используйте один формат.
Для ключей смотрите vehicle keys.
Добавить машину игроку с помощью SQL
Вы можете дать транспортное средство, вставив строку. Возьмите список столбцов из вашей собственной DESCRIBE, так как отсутствующий требуемый столбец делает вставку неудачной:
INSERT INTO owned_vehicles (owner, plate, vehicle, type, `stored`)
VALUES ('identifier-here', 'MIC 001', '{"model":-1130810103,"plate":"MIC 001"}', 'car', 1);model в JSON — это хеш модели, а не имя. Ваш фреймворк или ваш гараж обычно имеют команду или функцию, которая делает это правильно, что является более безопасным способом, когда он существует.
Контрольный список
| Симптом | Исправление |
|---|---|
| Гараж говорит нет транспортных средств | Проверьте, что owner или citizenid совпадает с вашим персонажем |
| Машина застряла снаружи после краша или перезагрузки | UPDATE сохраненный флаг или state обратно на garaged, в идеале при запуске |
| Купленная машина не показывается | Проверьте, что строка существует, владелец и гараж или тип |
Запрос stored дает синтаксическую ошибку |
Поместите обратные кавычки вокруг stored |
| Машина загружается без модов | Проверьте, что JSON vehicle или mods действительна и не пуста |
| Загружается неправильная машина | Посмотрите дубликаты номеров |
| Лодка или самолет отсутствует | Проверьте, что столбец type совпадает с гаражом |
Короткие ответы
Почему моей машины нет в гараже?
Либо строка не связана с вашим персонажем (неправильный владелец или citizenid), либо машина помечена как выше. Проверьте столбец владельца и сохраненный или столбец состояния в базе данных.
Что означает состояние в player_vehicles?
На QBCore и QBox state — это число: 0 означает, что машина находится в мире, 1 означает, что она находится в гараже, 2 означает, что она конфискована. Машина застрявшая на 0 не показывается в списке гаража.
Как мне вернуть каждую машину обратно в гараж?
Запустите одно UPDATE, которое устанавливает сохраненный флаг или состояние на значение garaged для строк, которые находятся снаружи. Лучше всего запустить его при запуске сервера, так как машина не может быть снаружи после перезагрузки.
Скрипты без этой проблемы
Advanced BoostingУгон машин на заказ через планшет: контракты от класса D до S+, команды и живая очередь.Смотреть скрипт →
Chameleon Paints82 краски-хамелеона с переливом цвета в одном меню — наносятся в один клик.Смотреть скрипт →
Car BombЗакладывайте, находите и обезвреживайте бомбы в машинах — с телефоном-детонатором и мини-игрой C4.Смотреть скрипт →