Топливо автомобиля FiveM: установить топливо при спауне и исправить автомобили, застрявшие на 0
Как работает топливо в FiveM: GetVehicleFuelLevel и SetVehicleFuelLevel, топливо в state bags, установка топлива при спауне автомобиля и почему автомобили начинают с пустым баком.
Типичные симптомы:
A freshly spawned car has the fuel gauge at 0 and the engine cuts out after a few metres.Топливо в FiveM — не одна система. У игры есть нативное для этого, но почти каждый сервер запускает ресурс топлива, который ведёт свои значения. В этой статье объясняются нативы, где ресурсы топлива хранят уровень и как правильно установить топливо при спауне автомобиля.
Два нативных
Игра хранит уровень топлива на каждом автомобиле. Вы читаете и пишете его на клиенте:
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
local fuel = GetVehicleFuelLevel(vehicle)
print('fuel', fuel)
SetVehicleFuelLevel(vehicle, 100.0)GetVehicleFuelLevel возвращает число с плавающей запятой, а SetVehicleFuelLevel принимает число с плавающей запятой. Значение соответствует объёму бензобака обработки автомобиля, поэтому скрипты обычно рассматривают его как процент и держат между 0 и 100.
Сам по себе нативный не потребляет топливо. Игра только разряжает его в определённых ситуациях, поэтому ресурс топлива — это то, что заставляет автомобили использовать топливо на основе скорости и оборотов.
Где ресурсы топлива хранят уровень
Это часть, которая вызывает большинство проблем. Ресурс топлива должен помнить уровень каждого автомобиля, и он выбирает одно из этих мест:
- State bag на сущности. Некоторые ресурсы хранят уровень в состоянии автомобиля, например
Entity(vehicle).state.fuel. Вот как работает ox_fuel, и несколько других современных ресурсов делают то же самое. См. state bags для того, как значения синхронизируются между сервером и клиентами. - Декоратор. Старые ресурсы хранят уровень с помощью
DecorSetFloatна автомобиле. - Только нативный. Самые простые скрипты читают
GetVehicleFuelLevelи пишутSetVehicleFuelLevelи ничего больше. - База данных. Многие ресурсы также сохраняют уровень собственных автомобилей, чтобы он сохранялся между сеансами, в столбце
fuelтаблицы автомобилей.
Вызов нативного, который не поддерживается местом, которое читает ваш ресурс, не имеет видимого эффекта. Если вы вызовите SetVehicleFuelLevel(vehicle, 100.0) и датчик останется на 0, ваш ресурс читает другой источник.
Совет: откройте файлы ресурса топлива и ищите
state.fuel,DecorиGetVehicleFuelLevel. Какой бы ресурс читал, вы должны написать именно его.
Установить топливо при спауне автомобиля
Что бы ни использовал ваш ресурс топлива, порядок один и тот же. Создайте автомобиль, дождитесь его существования, затем установите топливо:
local vehicle = CreateVehicle(model, coords.x, coords.y, coords.z, heading, true, false)
SetVehicleNumberPlateText(vehicle, plate)
-- 1. the native, for the game's own value
SetVehicleFuelLevel(vehicle, 100.0)
-- 2. the state bag, if your fuel resource reads one
Entity(vehicle).state:set('fuel', 100.0, true)Используйте только строку, которую читает ваш ресурс. Запись ключа state bag, который ничего не читает, безвредна, но бесполезна.
Некоторые ресурсы также предоставляют экспорт для установки уровня, чтобы вам не нужно было знать, где он хранится. Если ваш это делает, предпочитайте его и возьмите точное имя из его документации:
-- placeholder: the export name depends on your fuel resource
exports['your_fuel_resource']:SetFuel(vehicle, 100.0)Для автомобиля, созданного на сервере с помощью CreateVehicleServerSetter, установите значение на стороне сервера через state bag. Нативный SetVehicleFuelLevel работает на клиенте, поэтому для автомобилей, созданных на сервере, вы передаёте net id владельцу и устанавливаете его там, как описано в спауне автомобилей.
Собственные автомобили выходят пустыми
Если автомобили из вашего гаража начинают с одним и тем же низким значением каждый раз, гараж восстанавливает сохранённое значение, которое пусто. Проверьте таблицу автомобилей, которая обычно содержит последний известный уровень в столбце:
SELECT plate, fuel FROM player_vehicles WHERE plate = 'MIC 001';Частые причины:
- Столбец
fuelравен0илиNULL, потому что автомобиль был сохранён, пока значение не было сохранено. - Скрипт гаража никогда не читает столбец при спауне.
- Ресурс топлива сохраняет своё значение где-то ещё, чем читает гараж.
Чтобы исправить автомобили, которые уже застряли, установите столбец на полный бак:
UPDATE player_vehicles SET fuel = 100 WHERE fuel IS NULL OR fuel <= 0;На серверах ESX часто нет столбца fuel в owned_vehicles, так как топливо сохраняется внутри столбца JSON vehicle вместе с другими свойствами. См. свойства автомобилей для того, как этот JSON строится.
Автомобили застревают на 0 топлива
Пройдите через обычные причины:
Ресурс топлива не запущен или запущен поздно. Если он запускается после гаража, первые спауненные автомобили не имеют значения. Запустите его перед скриптами, которые спауют автомобили.
Два ресурса сражаются. Ресурс топлива и скрипт, который вызывает SetVehicleFuelLevel каждый кадр, перезаписывают друг друга, и датчик прыгает. Держите один источник.
Уровень установлен до существования сущности. При сетевом спауне вызов должен произойти после того, как DoesEntityExist true, или он не применяется ни к чему.
Модель имеет крошечный бак. Объём бензобака поступает из обработки. Пользовательский автомобиль с fPetrolTankVolume на очень низком значении быстро опустошается. Проверьте файл обработки автомобиля, см. редактирование обработки автомобиля.
Электромобили. Ресурс топлива, который их не исключает, разряжает бак, который не существует. Большинство ресурсов имеют список электрических моделей для пропуска.
Дозаправка без станции
Для автомобиля для тестирования или работы небольшой цикл держит бак полным, пока игрок его ведёт:
CreateThread(function()
while true do
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
if vehicle ~= 0 and GetVehicleFuelLevel(vehicle) < 20.0 then
SetVehicleFuelLevel(vehicle, 100.0)
end
Wait(2000)
end
end)Двухсекундный Wait преднамерен: топливо не требует проверки каждый кадр, см. как работает Wait.
Чеклист
| Симптом | Исправление |
|---|---|
| Спауненный автомобиль имеет 0 топлива | Установите топливо после спауна, там, где ваш ресурс топлива его читает |
SetVehicleFuelLevel ничего не меняет |
Ресурс читает state bag или декоратор: напишите это вместо этого или используйте его экспорт |
| Автомобили из гаража выходят пустыми | Проверьте столбец fuel или сохранённые свойства и убедитесь, что гараж их восстанавливает |
| Топливо прыгает вверх и вниз | Два скрипта устанавливают уровень: держите один |
| Автомобиль, созданный на сервере, не имеет топлива | Установите state bag на сервере или отправьте net id владельцу |
| Пустой бак на пользовательском автомобиле | Проверьте fPetrolTankVolume в его обработке |
| Электромобиль теряет топливо | Добавьте модель в список электромобилей ресурса топлива |
Короткие ответы
Почему автомобиль, который я спауню, не имеет топлива?
Ресурс топлива обычно сохраняет уровень в своём месте, такой как state bag, и новый автомобиль не имеет значения там. Установите топливо через ресурс топлива сразу после спауна.
Достаточно ли SetVehicleFuelLevel для заполнения бака?
Только для собственного значения игры. Если ваш ресурс топлива читает топливо из state bag или своей таблицы, он игнорирует нативное, поэтому установите значение там, где ресурс его читает.
Могу ли я сделать потребление топлива неограниченным?
Да. Держите уровень на максимуме на таймере или отключите потребление в конфигурации ресурса топлива, если такая опция есть.
Скрипты без этой проблемы
Advanced BoostingУгон машин на заказ через планшет: контракты от класса D до S+, команды и живая очередь.Смотреть скрипт →
Chameleon Paints82 краски-хамелеона с переливом цвета в одном меню — наносятся в один клик.Смотреть скрипт →
Car BombЗакладывайте, находите и обезвреживайте бомбы в машинах — с телефоном-детонатором и мини-игрой C4.Смотреть скрипт →