Получайте и устанавливайте свойства транспортного средства в FiveM: lib, ESX и QBCore

Сохраняйте и восстанавливайте моды транспортного средства, цвета и дополнения в FiveM: lib.getVehicleProperties, ESX.Game.GetVehicleProperties, QBCore.Functions.GetVehicleProperties, SetVehicleModKit и база данных.

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

text
A car comes out of the garage as a stock car: no colour, no turbo, no wheels, plain plate.

Внешний вид и тюнинг транспортного средства называются его свойствами. Чтобы их сохранить, вы читаете их из созданного транспортного средства, сохраняете как JSON и применяете к следующему созданному. Эта статья показывает функцию, которую предоставляет каждый фреймворк, одно правило о наборе модов и как сохранить результат в базе данных.

Что содержат свойства

Таблица свойств содержит все, что гараж должен восстановить: модель, номерной знак, цвета, ливрею, моды по индексу, тип колеса, дым шин, неон, тонировку окон, дополнения и значения здоровья. Это простая таблица Lua, поэтому вы превращаете ее в текст с json.encode для хранения.

ox_lib

Если ox_lib находится на вашем сервере, это самый короткий способ и единственный, который вам нужен на QBox:

lua
-- client
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
local props = lib.getVehicleProperties(vehicle)

-- later, on a spawned vehicle
lib.setVehicleProperties(vehicle, props)

Оба - это функции клиента. Они работают с любым фреймворком, потому что они читают игру непосредственно.

ESX

ESX имеет свою собственную пару на клиенте:

lua
local props = ESX.Game.GetVehicleProperties(vehicle)

ESX.Game.SetVehicleProperties(vehicle, props)

Сначала получите объект с ESX = exports['es_extended']:getSharedObject(). Если ESX равен nil, смотрите fixing esx:getSharedObject.

QBCore

QBCore имеет те же две функции на клиенте:

lua
local QBCore = exports['qb-core']:GetCoreObject()

local props = QBCore.Functions.GetVehicleProperties(vehicle)

QBCore.Functions.SetVehicleProperties(vehicle, props)

На QBox используйте пару ox_lib от выше.

Совет: если вы пишете скрипт, который должен работать на всех трех фреймворках, проверьте, какой из них работает и вызовите соответствующую пару, или просто используйте ox_lib везде, так как это уже зависимость большинства современных серверов.

SetVehicleModKit идет первым

Игра игнорирует SetVehicleMod, пока транспортное средство не имеет набора модов. Функции выше обрабатывают это, но если вы пишете свой собственный код применения, сделайте это в этом порядке:

lua
SetVehicleModKit(vehicle, 0)

SetVehicleMod(vehicle, 11, 3, false)   -- engine, level 3
SetVehicleMod(vehicle, 12, 2, false)   -- brakes
ToggleVehicleMod(vehicle, 18, true)    -- turbo

Первый аргумент SetVehicleModKit - это набор, и 0 - тот, который используют все. Типы модов - это числа: 11 - двигатель, 12 - тормоза, 13 - трансмиссия, 15 - подвеска, 16 - броня, и 18 - турбо, которое переключается вместо установки. Цвета, колеса, неон и тонировка имеют свои собственные встроенные функции, такие как SetVehicleColours, SetVehicleWheelType и SetVehicleNeonLightEnabled.

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

Сохраните в базе данных

Свойства хранятся как текст JSON в длинном текстовом столбце. Обычный поток:

  1. Клиент читает свойства из транспортного средства.
  2. Он отправляет их на сервер с номерным знаком.
  3. Сервер кодирует и сохраняет их.
lua
-- client
local props = lib.getVehicleProperties(vehicle)
TriggerServerEvent('my_garage:saveProps', props.plate, props)
lua
-- server
RegisterNetEvent('my_garage:saveProps', function(plate, props)
    local src = source
    -- check here that this player owns that plate before saving
    MySQL.update('UPDATE owned_vehicles SET vehicle = ? WHERE plate = ?', {
        json.encode(props), plate
    })
end)

Один и тот же вызов на QBCore и QBox пишет столбец mods в player_vehicles. Имена столбцов находятся в the garage tables article.

Внимание: никогда не доверяйте номерному знаку и свойствам от клиента без проверки владения на сервере. Иначе игрок может перезаписать транспортное средство кого-то другого. Смотрите securing server events.

Восстановите при спавне транспортного средства

Прочитайте JSON, декодируйте его, затем примените его после того как транспортное средство существует на этом клиенте:

lua
local row = MySQL.single.await('SELECT vehicle FROM owned_vehicles WHERE plate = ?', { plate })
local props = json.decode(row.vehicle)

-- send props to the client that owns the car, which applies:
lib.setVehicleProperties(vehicle, props)

Правила для применения:

  • Транспортное средство должно существовать и быть загруженным. Применяйте сразу после CreateVehicle с ожиданием на DoesEntityExist для сетевых. Смотрите spawning vehicles.
  • Модель должна быть одинаковой. Свойства другой модели применяют неправильные индексы модов.
  • Запустите его на клиенте, который управляет транспортным средством. Применение от клиента, который им не владеет, может не удасться.

Частые проблемы

Моды потеряны после сохранения. Сохранение выполнилось после удаления автомобиля, поэтому вы сохранили пустую таблицу. Читайте свойства сначала, затем удаляйте.

Номерной знак изменяется после восстановления. Сохраненный номерной знак - это часть свойств. Если вы спавните с одним номерным знаком и применяете свойства с другим, свойства выигрывают. Убедитесь, что оба совпадают, или ключи и база данных перестанут совпадать.

Цвета неправильные. Пользовательский цвет хранится со своими собственными значениями RGB, которые некоторые старые скрипты не восстанавливают. Используйте текущую функцию вашего фреймворка.

JSON слишком большой или недействительный. Столбец vehicle должен быть типом длинного текста, и данные должны поступать от json.encode. Таблица с ключами в смешанной числовой и строковой форме может кодировать как список вместо объекта, поэтому всегда загружайте и сравнивайте одну сохраненную строку при отладке.

Пользовательские или дополнительные автомобили. Пользовательские части модов зависят от meta модели и его потока. Если часть отсутствует в модели, индекс ничего не делает. Смотрите adding addon cars.

Контрольный список

Симптом Решение
Машина спавнится стандартно Применяйте свойства после того как транспортное средство существует, с lib.setVehicleProperties или функцией фреймворка
SetVehicleMod ничего не делает Вызовите SetVehicleModKit(vehicle, 0) сначала
Свойства работают только на клиенте Получение и установка запускаются на клиенте, сохраняйте результат на сервере
Номерной знак изменяется после восстановления Держите номерной знак в свойствах и спавне идентичными
Кто-нибудь может перезаписать машину Проверьте владение номерным знаком на сервере перед сохранением
Моды потеряны при сохранении Читайте свойства перед удалением транспортного средства
Сервер QBox Используйте пару ox_lib

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

Почему мои моды транспортного средства не применяются после спавна?

Моды применяются только после установки набора модов с SetVehicleModKit(vehicle, 0). Функции свойств делают это для вас, но ручной написанный цикл вызовов SetVehicleMod нуждается в этом сначала. Транспортное средство также должно существовать и быть загруженным.

Эти функции запускаются на сервере?

Нет. Получение и установка свойств использует встроенные функции клиента, поэтому запустите их на клиенте и отправьте результат на сервер для сохранения.

Какой использовать на QBox?

Версии ox_lib, lib.getVehicleProperties и lib.setVehicleProperties. QBox построен вокруг ox_lib, и одни и те же функции также работают на серверах ESX и QBCore, на которых работает ox_lib.

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

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

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

FiveMESXQBCoreДобавьте автомобили на FiveM дилерский центр (таблица ESX vehicles, QBCore, QBox)Как добавить автомобиль на дилерский центр: таблицы ESX vehicles и vehicle_categories, записи QBCore и QBox shared vehicles.lua, и почему автомобиль показывается без цены.1 октября 2026 г. · 4 мин чтенияЧитать →FiveMESXQBCoreГараж FiveM: owned_vehicles и player_vehicles, отсутствующие машины исправленыМашины отсутствуют в гараже? Как работают таблицы ESX owned_vehicles и QBCore player_vehicles, сохраненные и столбцы состояния, и SQL для исправления машин, застрявших снаружи.1 октября 2026 г. · 4 мин чтенияЧитать →FiveMESXQBCoreКлючи автомобиля FiveM: не можешь водить свой автомобиль или заблокировать его? Исправь этоКак работают системы ключей автомобилей в FiveM: списки номерных знаков, выдача ключей после спауна или покупки, блокировка с помощью SetVehicleDoorsLocked и почему вы теряете доступ к своему автомобилю.1 октября 2026 г. · 4 мин чтенияЧитать →