Разбор handling.meta: поля, единицы и флаги

Автор: Nilo3D · Обновлено:

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.00018.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 до 10.4Доля тяги на передних колёсах. Ниже 0.1 игра считает привод чисто задним, выше 0.9 чисто передним, всё между ними считается полным приводом.

Как работают поля тормозов и рулевого управления?

ПолеЕдиницаSultanЧто делает
fBrakeForceкоэффициент0.4Общая сила торможения.
fBrakeBiasFrontот 0 до 10.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 до 10.485Доля сцепления на передней оси. При меньших значениях передняя ось срывается первой (недостаточная поворачиваемость).
fTractionLossMultмножитель1.0Насколько сильно поверхность под колёсами (трава, песок, грязь) снижает сцепление, добавляет сопротивление и режет максимальную скорость. При 0 поверхность игнорируется.

Флаг handling HF_HAS_RALLY_TYRES (0x8) переворачивает кривую: при скольжении шины сцепление растёт к Max, а не падает.

Что делают поля подвески?

ПолеSultanЧто делает
fSuspensionForce2.8Жёсткость пружин.
fSuspensionCompDamp, fSuspensionReboundDamp1.2, 2.1Демпфирование при сжатии пружины и при её отбое. Оба значения при загрузке умножаются на 0.1. При низких значениях транспорт раскачивается, при высоких держится плотно.
fSuspensionUpperLimit, fSuspensionLowerLimit0.15, -0.14Насколько колесо может сместиться вверх и вниз от положения покоя, в метрах.
fSuspensionRaise0Поднимает или опускает кузов относительно колёс, в метрах.
fSuspensionBiasFront0.5Доля силы пружин на передней оси (от 0 до 1).
fAntiRollBarForce, fAntiRollBarBiasFront0.3, 0.53Сила стабилизатора поперечной устойчивости и её доля на передней оси. Чем больше сила, тем меньше крен кузова в поворотах.
fRollCentreHeightFront, fRollCentreHeightRear0.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Эффект
strModelFlagsMF_IS_VAN0x1Фургон.
MF_ABS_STD0x10ABS в стандартной комплектации.
MF_NO_DOORS0x100У транспорта нет дверей.
MF_NO_WHEEL_BURST0x2000000Шины не лопаются.
MF_IS_RC0x10000000Радиоуправляемая машина.
strHandlingFlagsHF_HAS_RALLY_TYRES0x8Переворачивает кривую сцепления.
HF_NO_HANDBRAKE0x10Нет ручного тормоза.
HF_STEER_REARWHEELS0x20Рулит задними колёсами.
HF_NO_REVERSE0x200Не может ехать задним ходом.
HF_CVT0x1000Бесступенчатая трансмиссия (вариатор).
HF_OFFROAD_ABILITIES0x100000Дополнительная гравитация для сцепления на бездорожье.
HF_ARMOURED0x8000000Пуленепробиваемый.
strDamageFlagsDF_DRIVER_SIDE_FRONT_DOOR0x1Флаг урона двери для двери водителя.
DF_BONNET, DF_BOOT0x10, 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.

Источники

Товары из гайда

Все гайды