Разбор handling.meta: поля, единицы и флаги
handling.meta определяет, как транспорт едет в GTA V. Каждая запись задаёт массу, тягу, передачи, максимальную скорость, тормоза, рулевое управление, сцепление шин, подвеску и множители урона, а также hex-флаги и необязательные блоки sub-handling для машин, мотоциклов, лодок и авиации. Транспорт использует ту запись, у которой handlingName равен его handlingId в vehicles.meta.
Что такое handling.meta?
В handling.meta лежит XML-список элементов CHandlingData. Каждый элемент описывает один физический профиль, и игра находит его по handlingName. В FiveM файл загружается строкой data_file 'HANDLING_FILE'. Запись ниже взята у стокового Sultan, изменено только имя; значения в таблицах на этой странице относятся к ней.
<?xml version="1.0" encoding="UTF-8"?>
<CHandlingDataMgr>
<HandlingData>
<Item type="CHandlingData">
<handlingName>MYCAR</handlingName>
<fMass value="1400.000000" />
<fInitialDragCoeff value="8.000000" />
<fPercentSubmerged value="85.000000" />
<vecCentreOfMassOffset x="0.000000" y="0.000000" z="0.000000" />
<vecInertiaMultiplier x="1.000000" y="1.400000" z="1.600000" />
<fDriveBiasFront value="0.400000" />
<nInitialDriveGears value="5" />
<fInitialDriveForce value="0.260000" />
<fDriveInertia value="1.000000" />
<fClutchChangeRateScaleUpShift value="1.800000" />
<fClutchChangeRateScaleDownShift value="1.800000" />
<fInitialDriveMaxFlatVel value="145.000000" />
<fBrakeForce value="0.400000" />
<fBrakeBiasFront value="0.650000" />
<fHandBrakeForce value="0.700000" />
<fSteeringLock value="35.000000" />
<fTractionCurveMax value="2.350000" />
<fTractionCurveMin value="1.950000" />
<fTractionCurveLateral value="22.500000" />
<fTractionSpringDeltaMax value="0.150000" />
<fLowSpeedTractionLossMult value="1.400000" />
<fCamberStiffnesss value="0.000000" />
<fTractionBiasFront value="0.485000" />
<fTractionLossMult value="1.000000" />
<fSuspensionForce value="2.800000" />
<fSuspensionCompDamp value="1.200000" />
<fSuspensionReboundDamp value="2.100000" />
<fSuspensionUpperLimit value="0.150000" />
<fSuspensionLowerLimit value="-0.140000" />
<fSuspensionRaise value="0.000000" />
<fSuspensionBiasFront value="0.500000" />
<fAntiRollBarForce value="0.300000" />
<fAntiRollBarBiasFront value="0.530000" />
<fRollCentreHeightFront value="0.240000" />
<fRollCentreHeightRear value="0.250000" />
<fCollisionDamageMult value="0.700000" />
<fWeaponDamageMult value="1.000000" />
<fDeformationDamageMult value="0.700000" />
<fEngineDamageMult value="1.500000" />
<fPetrolTankVolume value="65.000000" />
<fOilVolume value="5.000000" />
<fSeatOffsetDistX value="0.000000" />
<fSeatOffsetDistY value="0.000000" />
<fSeatOffsetDistZ value="0.050000" />
<nMonetaryValue value="35000" />
<strModelFlags>440010</strModelFlags>
<strHandlingFlags>0</strHandlingFlags>
<strDamageFlags>0</strDamageFlags>
<AIHandling>AVERAGE</AIHandling>
<SubHandlingData>
<Item type="CCarHandlingData">
<fBackEndPopUpCarImpulseMult value="0.100000" />
<fBackEndPopUpBuildingImpulseMult value="0.030000" />
<fBackEndPopUpMaxDeltaSpeed value="0.600000" />
</Item>
<Item type="NULL" />
<Item type="NULL" />
</SubHandlingData>
</Item>
</HandlingData>
</CHandlingDataMgr>
У каждого поля есть минимум и максимум в схеме данных игры. У большинства дробных значений диапазон от 0 до 1000, fMass доходит до 100000, а число передач ограничено 10. В таблицах описано, что игра делает с числом после загрузки; эти сведения взяты из кода handling.
Что делают fMass, сопротивление воздуха и центр масс?
| Поле | Единица | Sultan | Что делает |
|---|---|---|---|
fMass | кг | 1400 | Масса транспорта. Участвует во всех расчётах сил и столкновений. |
fInitialDragCoeff | при загрузке умножается на 0.0001 | 8.0 | Сопротивление воздуха. Чем выше значение, тем сильнее транспорт замедляется на скорости. |
fPercentSubmerged | % | 85 | Какая часть транспорта находится под водой, когда он на плаву. Игра получает константу плавучести как 100, делённое на это значение. |
vecCentreOfMassOffset | метры | 0, 0, 0 | Смещает центр масс. y направлена вперёд и назад, z вверх и вниз. Чем выше центр, тем легче транспорт переворачивается. |
vecInertiaMultiplier | множитель по осям | 1.0, 1.4, 1.6 | Момент инерции. Чем меньше значение по оси, тем легче транспорт вращается вокруг неё. |
Какие поля задают разгон и максимальную скорость?
Максимальную скорость задаёт поле fInitialDriveMaxFlatVel, а разгон поле fInitialDriveForce. При загрузке игра переводит скорость из км/ч в м/с, а затем добавляет 20%, чтобы получить скорость для расчёта передач. Поэтому транспорт едет немного быстрее числа в файле.
| Поле | Единица | Sultan | Что делает |
|---|---|---|---|
fInitialDriveMaxFlatVel | км/ч | 145 | Опорная максимальная скорость на ровной поверхности. Для расчёта передач это значение умножается на 1.2. |
fInitialDriveForce | коэффициент | 0.26 | Тяга двигателя. Увеличивает разгон. |
nInitialDriveGears | количество | 5 | Число передних передач. Всё, что больше 10, обрезается до 10. |
fDriveInertia | коэффициент | 1.0 | Как быстро растут и падают обороты двигателя. |
fClutchChangeRateScaleUpShift, ...DownShift | коэффициент | 1.8 | Как быстро сцепление включается после переключения. Чем выше значение, тем быстрее переключение. |
fDriveBiasFront | от 0 до 1 | 0.4 | Доля тяги на передних колёсах. Ниже 0.1 игра считает привод чисто задним, выше 0.9 чисто передним, всё между ними считается полным приводом. |
Как работают поля тормозов и рулевого управления?
| Поле | Единица | Sultan | Что делает |
|---|---|---|---|
fBrakeForce | коэффициент | 0.4 | Общая сила торможения. |
fBrakeBiasFront | от 0 до 1 | 0.65 | Доля торможения на передней оси. Остальное приходится на заднюю. |
fHandBrakeForce | коэффициент | 0.7 | Сила ручного тормоза. |
fSteeringLock | градусы | 35 | Максимальный угол поворота колёс. При загрузке переводится в радианы. |
Что такое кривая сцепления?
Кривая сцепления описывает модель сцепления шин. Сцепление максимально при небольшом угле увода (fTractionCurveMax) и падает к fTractionCurveMin, когда шина скользит. Max должен быть больше Min и выше нуля, иначе загрузчик предупреждает о некорректной кривой.
| Поле | Единица | Sultan | Что делает |
|---|---|---|---|
fTractionCurveMax | коэффициент сцепления | 2.35 | Пиковое сцепление, пока шина ещё не скользит. |
fTractionCurveMin | коэффициент сцепления | 1.95 | Сцепление, когда шина уже скользит. |
fTractionCurveLateral | градусы | 22.5 | Диапазон углов увода кривой. При большем угле сцепление падает плавнее, и заносы легче контролировать. |
fTractionSpringDeltaMax | предел | 0.15 | Предел, который использует боковая пружина модели шины. |
fLowSpeedTractionLossMult | множитель | 1.4 | Дополнительная потеря сцепления при старте с места. 0 отключает эффект; чем выше значение, тем сильнее пробуксовка на старте. |
fCamberStiffnesss | множитель | 0 | Боковая сила от наклона; работает только при значении выше 0 и используется в основном мотоциклами. В теге действительно три буквы s. |
fTractionBiasFront | от 0 до 1 | 0.485 | Доля сцепления на передней оси. При меньших значениях передняя ось срывается первой (недостаточная поворачиваемость). |
fTractionLossMult | множитель | 1.0 | Насколько сильно поверхность под колёсами (трава, песок, грязь) снижает сцепление, добавляет сопротивление и режет максимальную скорость. При 0 поверхность игнорируется. |
Флаг handling HF_HAS_RALLY_TYRES (0x8) переворачивает кривую: при скольжении шины сцепление растёт к Max, а не падает.
Что делают поля подвески?
| Поле | Sultan | Что делает |
|---|---|---|
fSuspensionForce | 2.8 | Жёсткость пружин. |
fSuspensionCompDamp, fSuspensionReboundDamp | 1.2, 2.1 | Демпфирование при сжатии пружины и при её отбое. Оба значения при загрузке умножаются на 0.1. При низких значениях транспорт раскачивается, при высоких держится плотно. |
fSuspensionUpperLimit, fSuspensionLowerLimit | 0.15, -0.14 | Насколько колесо может сместиться вверх и вниз от положения покоя, в метрах. |
fSuspensionRaise | 0 | Поднимает или опускает кузов относительно колёс, в метрах. |
fSuspensionBiasFront | 0.5 | Доля силы пружин на передней оси (от 0 до 1). |
fAntiRollBarForce, fAntiRollBarBiasFront | 0.3, 0.53 | Сила стабилизатора поперечной устойчивости и её доля на передней оси. Чем больше сила, тем меньше крен кузова в поворотах. |
fRollCentreHeightFront, fRollCentreHeightRear | 0.24, 0.25 | Высоты центров крена в метрах, используются для переноса веса в поворотах. |
Если у заниженной машины колёса проходят сквозь арки, обычно верхний ход подвески слишком велик для места в колёсной арке: уменьшите fSuspensionUpperLimit и увеличьте демпфирование, прежде чем трогать жёсткость пружин.
Что такое поля урона и прочие поля?
fCollisionDamageMult,fWeaponDamageMult,fEngineDamageMult: множители урона от столкновений, от оружия и урона двигателю.fDeformationDamageMult: насколько заметно деформируется кузов.fPetrolTankVolume,fOilVolume: объём бака и объём масла.fSeatOffsetDistX/Y/Z: смещения позиции сиденья.nMonetaryValue: базовая стоимость транспорта, до 1000000.AIHandling: имя профиля вождения ИИ, напримерAVERAGE. Влияет только на водителей, которыми управляет компьютер.fDownforceModifier(от 0 до 100),fRocketBoostCapacityиfBoostMaxSpeed: более новые необязательные поля для прижимной силы и ракетного ускорения.
Как работают strModelFlags и strHandlingFlags?
В трёх полях флагов хранятся шестнадцатеричные битовые маски, записанные без префикса 0x. Чтобы собрать маску, сложите hex-значения нужных флагов. 440010 у Sultan состоит из трёх флагов:
MF_ABS_STD 0x00000010
MF_AXLE_F_MCPHERSON 0x00040000
MF_AXLE_R_MCPHERSON 0x00400000
----------
strModelFlags 0x00440010 -> <strModelFlags>440010</strModelFlags>
| Поле | Флаг | Hex | Эффект |
|---|---|---|---|
strModelFlags | MF_IS_VAN | 0x1 | Фургон. |
MF_ABS_STD | 0x10 | ABS в стандартной комплектации. | |
MF_NO_DOORS | 0x100 | У транспорта нет дверей. | |
MF_NO_WHEEL_BURST | 0x2000000 | Шины не лопаются. | |
MF_IS_RC | 0x10000000 | Радиоуправляемая машина. | |
strHandlingFlags | HF_HAS_RALLY_TYRES | 0x8 | Переворачивает кривую сцепления. |
HF_NO_HANDBRAKE | 0x10 | Нет ручного тормоза. | |
HF_STEER_REARWHEELS | 0x20 | Рулит задними колёсами. | |
HF_NO_REVERSE | 0x200 | Не может ехать задним ходом. | |
HF_CVT | 0x1000 | Бесступенчатая трансмиссия (вариатор). | |
HF_OFFROAD_ABILITIES | 0x100000 | Дополнительная гравитация для сцепления на бездорожье. | |
HF_ARMOURED | 0x8000000 | Пуленепробиваемый. | |
strDamageFlags | DF_DRIVER_SIDE_FRONT_DOOR | 0x1 | Флаг урона двери для двери водителя. |
DF_BONNET, DF_BOOT | 0x10, 0x20 | Флаги урона дверей для капота и багажника. |
Что такое блоки SubHandlingData?
SubHandlingData содержит до четырёх дополнительных блоков, каждый для одного вида транспорта. Добавьте блок, подходящий транспорту, а остальные слоты оставьте как <Item type="NULL" />. Блок не того вида игра игнорирует.
| Тип блока | Для чего | Примеры полей |
|---|---|---|
CCarHandlingData | Машины | fToeFront, fCamberFront, fCastor, fEngineResistance, strAdvancedFlags |
CBikeHandlingData | Мотоциклы и велосипеды | fMaxBankAngle, fWheelieBalancePoint, fInAirSteerMult, fJumpForce |
CFlyingHandlingData | Самолёты и вертолёты | fThrust, fYawMult, fRollMult, fPitchMult, fFormLiftMult |
CBoatHandlingData | Лодки | fBoxFrontMult, fAquaplaneForce, fRudderForce |
CSpecialFlightHandlingData | Режимы парения и полёта у наземного транспорта | mode, fMaxThrust, vecAngularDamping, strFlags |
CSubmarineHandlingData, CTrailerHandlingData, CSeaPlaneHandlingData, CVehicleWeaponHandlingData | Подводные лодки, прицепы, гидросамолёты, вооружённый транспорт | Скорость погружения, пределы сцепки, поплавки, пределы турели |
Полётный handling у ховербордов Nilo3D сделан именно так, в файле handling и без скрипта. В блоке для мотоцикла углы наклона и баланса записываются в градусах и при загрузке переводятся в радианы.
Остальные файлы, которые нужны доске, перечислены в гайде как ховерборд FiveM работает без скрипта.
Как тестировать изменения handling?
Меняйте по одному значению за раз, перезапускайте ресурс и проезжайте один и тот же участок дороги, прежде чем менять следующее. Храните копию последней версии, которая ощущалась правильно. Стоковая запись похожего транспорта лучше всего показывает, находится ли значение в нормальном диапазоне: в handling.meta самой игры есть запись для каждого стокового транспорта.
Handling работает, только если запись связана правильно: handlingName здесь, handlingId в vehicles.meta и строка HANDLING_FILE в манифесте, как показано в гайде о добавлении аддон-транспорта в FiveM. Если транспорт вообще не реагирует на ваши правки, смотрите раздел о handling в гайде по устранению проблем.
Частые вопросы
- Как увеличить максимальную скорость в handling.meta?
- Увеличьте fInitialDriveMaxFlatVel, оно задаётся в км/ч. Для расчёта передач игра умножает это значение на 1.2. Если транспорт перестаёт разгоняться раньше, увеличьте fInitialDriveForce или уменьшите fInitialDragCoeff.
- В каких единицах задаётся fInitialDriveMaxFlatVel?
- В километрах в час. При загрузке игра умножает значение на 1000/3600, чтобы получить метры в секунду.
- Как сделать машину полноприводной?
- Задайте fDriveBiasFront между 0.1 и 0.9. При 0.5 тяга делится поровну. Ниже 0.1 игра считает машину заднеприводной, а выше 0.9 переднеприводной.
- Почему мой handling.meta ничего не меняет?
- Либо handlingName не совпадает с handlingId в vehicles.meta, либо файл не загружен строкой data_file с типом HANDLING_FILE, либо другой ресурс определяет тот же handlingName. Давайте каждому аддон-транспорту уникальное имя handling.
- Как записывать флаги handling?
- Сложите шестнадцатеричные значения нужных флагов и запишите сумму без 0x. Например, 0x10 + 0x40000 + 0x400000 записывается как 440010.
Источники
Товары из гайда
Все гайды
- Как установить ресурс FiveM из Cfx.re Escrow (Granted Assets)
- Как добавить кастомный транспорт на сервер ESX, QBCore или QBox
- Что такое LOD у транспорта в FiveM?
- Как добавить аддон-транспорт на сервер FiveM
- Разбор vehicles.meta по полям
- Разбор carvariations.meta и carcols.meta
- Разбор vehiclelayouts.meta: сиденья, точки входа и анимации
- Справочник data_file в fxmanifest для транспорта
- Файлы модели транспорта (yft, _hi.yft, ytd) и предупреждение oversized assets
- Проблемы с аддон-транспортом в FiveM: причины и решения
- Как исправить "You lack the required entitlement" на сервере FiveM
- Как конвертировать мод машины для одиночной GTA 5 в аддон FiveM
- Как ховерборд в FiveM работает без скрипта
- Как сделать транспорт для FiveM в Blender с Sollumz 2.9
- Как оптимизировать транспорт FiveM: полигоны, LOD и бюджет текстур
- Как настроить коллизию транспорта в Sollumz
- Покупка транспорта для FiveM: что проверить до оплаты
- Паки машин FiveM или отдельный транспорт
- Машины реальных брендов в FiveM: можно или нет?
- CodeWalker или Sollumz: какой инструмент нужен для транспорта FiveM?
