FiveM механик работа: repair natives, tuning модификации и проверки работы
Постройте FiveM механик работу: отремонтируйте машину с SetVehicleFixed и health natives, настройте с SetVehicleModKit и SetVehicleMod, сохраните модификации, и заблокируйте действия по работе.
Симптом: ваш механик чинит машину и двигатель всё ещё дымит, вмятины остаются, настроенная деталь исчезает после перезагрузки, или любой игрок может чинить машины бесплатно.
Механик работа это две работы в одной: ремонт (значения здоровья и natives) и настройка (мод машины). Оба запускаются на клиенте, поэтому часть которую вы должны защитить это кто разрешен их запускать.
Ремонт машины
Одного native недостаточно для чистого ремонта. Эта комбинация делает работу:
-- client
local function repairVehicle(vehicle)
SetVehicleFixed(vehicle)
SetVehicleDeformationFixed(vehicle)
SetVehicleEngineHealth(vehicle, 1000.0)
SetVehicleBodyHealth(vehicle, 1000.0)
SetVehicleUndriveable(vehicle, false)
SetVehicleEngineOn(vehicle, true, true, false)
endSetVehicleFixedчинит машину в целом, включая шины.SetVehicleDeformationFixedудаляет вмятины которые первый native может оставить позади.SetVehicleEngineHealthиSetVehicleBodyHealthпринимают значение до1000.0. Ниже нуля двигатель мёртв, поэтому установка их обратно делает его запуск снова.
Потому что машина это сетевая сущность, клиент который делает ремонт должен ей владеть. Если ремонт работает на вашей собственной машине и не на машине клиента, запросите управление сначала:
NetworkRequestControlOfEntity(vehicle)
local timeout = 0
while not NetworkHasControlOfEntity(vehicle) and timeout < 50 do
Wait(10)
timeout += 1
endДля частичного ремонта (только двигатель, только кузов), вызовите только соответствующий native здоровья. Значения здоровья также важны для других скриптов, например урон машины и здоровье двигателя объясняет что каждое число делает.
Настройка с SetVehicleMod
Моды это нумерованные слоты. Два правила применяются ко всем из них:
- Вызовите
SetVehicleModKit(vehicle, 0)перед любым изменением мода. - Спросите у игры сколько опций слот имеет с
GetNumVehicleMods. Индекс-1это стоковая деталь.
-- client
local function setMod(vehicle, modType, index)
SetVehicleModKit(vehicle, 0)
local count = GetNumVehicleMods(vehicle, modType)
if index >= -1 and index < count then
SetVehicleMod(vehicle, modType, index, false)
end
end
-- engine is mod type 11, brakes 12, transmission 13, suspension 15
setMod(vehicle, 11, 2)
-- turbo is a toggle, not a numbered mod
ToggleVehicleMod(vehicle, 18, true)Проверка индекса против GetNumVehicleMods избегает молчаливого отказа когда машина имеет меньше опций чем вы ожидали. Краска и цвет используют свои собственные natives (SetVehicleColours и другие), поэтому обращайтесь с ними как отдельное меню.
Совет: постройте меню настройки из самой машины, циклируя слоты с
GetNumVehicleMods, нежели жёстко кодируя числа. Машины дополнений часто имеют разное количество опций.
Сохранение модов
Установка мода только изменяет живую сущность. Когда игрок хранит машину в гараже и вынимает её снова, мод уходит если его не сохранили с машиной. Сохраняйте полный набор свойств после настройки и применяйте их когда машина спаунится. Весь поток находится в сохранение свойств машины и модов.
Работа-гейтед действия
Код ремонта и настройки запускается на клиенте, поэтому модифицированный клиент может вызвать его для кого-либо. Поместите правило на сервер:
-- server (ox_lib)
lib.callback.register('mechanic:canRepair', function(source)
-- 1. job check: use your framework's player/job getter here
-- 2. distance check: the player must be near a vehicle or workshop
-- 3. item check and removal
local removed = exports.ox_inventory:RemoveItem(source, 'repairkit', 1)
return removed and true or false
end)-- client
lib.callback('mechanic:canRepair', false, function(ok)
if ok then repairVehicle(vehicle) end
end)Проверка работы зависит от вашего фреймворка. На ESX читайте работу из объекта игрока, на QBCore и QBox читайте её из данных игрока. Используйте геттер вашего фреймворка в шаге 1 и сравните против названия вашей механик работы, как покрыто в добавление работы на ESX и добавление работы на QBCore. Для паттерна callback через фреймворки, смотрите серверные callbacks.
Другие вещи стоящие блокировки:
- Ремонтные наборы как предметы, так что ремонт что-то стоит и предмет удаляется на сервере.
- Зоны мастерских, так что настройка открывается только внутри гаража или на верстаке.
- Платить механику или счёту общества на сервере, не с клиента.
Полоса прогресса с опцией отмены делает ремонты правильными. Смотрите полосы прогресса на ESX, QBCore и ox_lib.
Контрольный список
| Симптом | Решение |
|---|---|
| Вмятины остаются после ремонта | Добавьте SetVehicleDeformationFixed |
| Двигатель всё ещё дымит | Установите здоровье двигателя обратно в 1000.0 |
| Ремонт работает только на вашей собственной машине | Запросите сетевое управление машиной сначала |
SetVehicleMod не делает ничего |
Вызовите SetVehicleModKit(vehicle, 0) сначала |
| Индекс мода вне диапазона | Проверьте GetNumVehicleMods для этого слота |
| Моды исчезают после перезагрузки | Сохраняйте свойства с машиной |
| Кто-либо может чинить | Проверьте работу, расстояние и предмет на сервере |
Короткие ответы
Почему SetVehicleFixed не чинит урон кузова?
Это чинит большинство машины но не всегда видимую деформацию. Вызовите SetVehicleDeformationFixed(vehicle) также, и установите здоровье двигателя и кузова сами.
Почему SetVehicleMod не делает ничего?
Вы должны вызвать SetVehicleModKit(vehicle, 0) сначала. Без мод кита, игра игнорирует изменение мода.
Как я убедиться что только механики могут чинить?
Проверьте работу на сервере перед тем как вы примете ремонт, и возьмите предмет ремонта на сервере. Проверка работы на клиенте может быть пропущена модифицированным клиентом.

