handling.meta explicado: campos, unidades e flags

Por Nilo3D · Atualizado:

O handling.meta define como um veículo anda no GTA V. Cada entrada traz massa, força de tração, marchas, velocidade máxima, freios, direção, aderência dos pneus, suspensão e multiplicadores de dano, além de flags em hexadecimal e blocos opcionais de sub-handling para carros, motos, barcos e aeronaves. Um veículo usa a entrada cujo handlingName é igual ao seu handlingId no vehicles.meta.

O que é o handling.meta?

O handling.meta é uma lista em XML de itens CHandlingData. Cada item é um perfil de física, identificado por handlingName. No FiveM ele é carregado com data_file 'HANDLING_FILE'. A entrada abaixo é o Sultan original com o nome trocado; os valores das tabelas desta página se referem a ela.

<?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>

Todo campo tem um mínimo e um máximo no schema de dados do jogo. Para a maioria dos floats a faixa é de 0 a 1000, o fMass vai até 100000, e a quantidade de marchas é limitada a 10. Os valores das tabelas são o que o jogo faz com o número depois de carregar, tirados do código de handling.

O que fazem fMass, arrasto e centro de massa?

CampoUnidadeSultanO que faz
fMasskg1400Massa do veículo. Usada em todo cálculo de força e de colisão.
fInitialDragCoeffmultiplicado por 0.0001 ao carregar8.0Arrasto do ar. Valores mais altos seguram mais o veículo em velocidade.
fPercentSubmerged%85Quanto do veículo fica debaixo da água ao flutuar. O jogo calcula a constante de flutuação como 100 dividido por esse valor.
vecCentreOfMassOffsetmetros0, 0, 0Desloca o centro de massa. y é de frente para trás, z é para cima e para baixo. Um centro mais alto faz o veículo capotar com mais facilidade.
vecInertiaMultipliermultiplicador por eixo1.0, 1.4, 1.6Inércia de rotação. Um valor menor em um eixo faz o veículo girar com mais facilidade em torno dele.

Quais campos definem aceleração e velocidade máxima?

A velocidade máxima vem de fInitialDriveMaxFlatVel e a aceleração de fInitialDriveForce. O jogo converte a velocidade de km/h para m/s ao carregar e depois soma 20% para chegar à velocidade usada no câmbio, e é por isso que os veículos andam um pouco mais rápido que o número do arquivo.

CampoUnidadeSultanO que faz
fInitialDriveMaxFlatVelkm/h145Referência de velocidade máxima em terreno plano. O câmbio usa esse valor vezes 1.2.
fInitialDriveForceescala0.26Força de tração do motor. Aumenta a aceleração.
nInitialDriveGearsquantidade5Número de marchas para frente. Qualquer coisa acima de 10 é cortada para 10.
fDriveInertiaescala1.0A rapidez com que o giro do motor sobe e cai.
fClutchChangeRateScaleUpShift, ...DownShiftescala1.8A rapidez com que a embreagem volta a acoplar depois de uma troca. Quanto mais alto, mais rápida a troca.
fDriveBiasFront0 a 10.4Parcela da tração nas rodas dianteiras. Abaixo de 0.1 o jogo trata como tração traseira pura, acima de 0.9 como tração dianteira pura, e qualquer coisa no meio é tração nas quatro rodas.

Como funcionam os campos de freio e direção?

CampoUnidadeSultanO que faz
fBrakeForceescala0.4Força geral de frenagem.
fBrakeBiasFront0 a 10.65Parcela da frenagem no eixo dianteiro. O traseiro fica com o resto.
fHandBrakeForceescala0.7Força do freio de mão.
fSteeringLockgraus35Ângulo máximo de esterço das rodas. Convertido para radianos ao carregar.

O que é a curva de tração?

A curva de tração é o modelo de aderência dos pneus. A aderência é máxima em um ângulo de deslizamento pequeno (fTractionCurveMax) e cai em direção a fTractionCurveMin conforme o pneu desliza. Max tem que ser maior que Min e estar acima de zero, senão o carregador avisa de uma curva inválida.

CampoUnidadeSultanO que faz
fTractionCurveMaxcoeficiente de aderência2.35Aderência de pico, antes de o pneu começar a deslizar.
fTractionCurveMincoeficiente de aderência1.95Aderência depois que o pneu está deslizando.
fTractionCurveLateralgraus22.5Faixa de ângulo de deslizamento da curva. Um ângulo maior faz a aderência cair de forma mais gradual, então as derrapagens perdoam mais.
fTractionSpringDeltaMaxlimite0.15Limite usado pela mola lateral do modelo de pneu.
fLowSpeedTractionLossMultmultiplicador1.4Perda extra de aderência ao arrancar parado. 0 desliga o efeito; valores mais altos dão mais patinação na largada.
fCamberStiffnesssmultiplicador0Força lateral vinda da inclinação; só faz algo acima de 0 e é usada principalmente por motos. A tag tem mesmo três s.
fTractionBiasFront0 a 10.485Parcela da aderência no eixo dianteiro. Valores menores fazem a frente deslizar primeiro (subesterço).
fTractionLossMultmultiplicador1.0O quanto a superfície sob as rodas (grama, areia, lama) tira aderência, soma arrasto e corta a velocidade máxima. 0 ignora a superfície.

A flag de handling HF_HAS_RALLY_TYRES (0x8) inverte a curva: a aderência sobe em direção a Max conforme o pneu desliza, em vez de cair.

O que fazem os campos de suspensão?

CampoSultanO que faz
fSuspensionForce2.8Rigidez da mola.
fSuspensionCompDamp, fSuspensionReboundDamp1.2, 2.1Amortecimento enquanto a mola comprime e enquanto ela estende. Os dois são multiplicados por 0.1 ao carregar. Valores baixos quicam, valores altos deixam o carro assentado.
fSuspensionUpperLimit, fSuspensionLowerLimit0.15, -0.14O quanto a roda pode se deslocar para cima e para baixo a partir do repouso, em metros.
fSuspensionRaise0Levanta ou abaixa a carroceria em relação às rodas, em metros.
fSuspensionBiasFront0.5Parcela da força de mola no eixo dianteiro (0 a 1).
fAntiRollBarForce, fAntiRollBarBiasFront0.3, 0.53Força da barra estabilizadora e sua parcela dianteira. Mais força dá menos rolagem da carroceria nas curvas.
fRollCentreHeightFront, fRollCentreHeightRear0.24, 0.25Alturas do centro de rolagem em metros, usadas na transferência de peso nas curvas.

Em carro rebaixado com as rodas atravessando os para-lamas, o curso para cima normalmente é grande demais para o espaço da caixa de roda: reduza o fSuspensionUpperLimit e aumente o amortecimento antes de mexer na força da mola.

Quais são os campos de dano e os diversos?

  • fCollisionDamageMult, fWeaponDamageMult, fEngineDamageMult: multiplicadores do dano de batidas, de armas e ao motor.
  • fDeformationDamageMult: o quanto a carroceria deforma visivelmente.
  • fPetrolTankVolume, fOilVolume: volume do tanque e do óleo.
  • fSeatOffsetDistX/Y/Z: deslocamentos da posição do assento.
  • nMonetaryValue: valor base do veículo, até 1000000.
  • AIHandling: nome do perfil de direção da IA, por exemplo AVERAGE. Só afeta motoristas controlados pelo computador.
  • fDownforceModifier (0 a 100), fRocketBoostCapacity e fBoostMaxSpeed: campos opcionais mais novos para downforce e rocket boost.

Como funcionam strModelFlags e strHandlingFlags?

Os três campos de flags são bitmasks hexadecimais escritas sem o prefixo 0x. Para montar uma, some os valores hex das flags que você quer. O 440010 do Sultan são três flags:

MF_ABS_STD           0x00000010
MF_AXLE_F_MCPHERSON  0x00040000
MF_AXLE_R_MCPHERSON  0x00400000
                     ----------
strModelFlags        0x00440010  ->  <strModelFlags>440010</strModelFlags>
CampoFlagHexEfeito
strModelFlagsMF_IS_VAN0x1Van.
MF_ABS_STD0x10ABS de série.
MF_NO_DOORS0x100O veículo não tem portas.
MF_NO_WHEEL_BURST0x2000000Os pneus não estouram.
MF_IS_RC0x10000000Carro de controle remoto.
strHandlingFlagsHF_HAS_RALLY_TYRES0x8Inverte a curva de tração.
HF_NO_HANDBRAKE0x10Sem freio de mão.
HF_STEER_REARWHEELS0x20Esterça com as rodas traseiras.
HF_NO_REVERSE0x200Não dá ré.
HF_CVT0x1000Câmbio continuamente variável.
HF_OFFROAD_ABILITIES0x100000Gravidade extra para aderência off-road.
HF_ARMOURED0x8000000À prova de balas.
strDamageFlagsDF_DRIVER_SIDE_FRONT_DOOR0x1Flag de dano de porta para a porta do motorista.
DF_BONNET, DF_BOOT0x10, 0x20Flags de dano de porta para capô e porta-malas.

O que são os blocos SubHandlingData?

SubHandlingData guarda até quatro blocos extras, cada um para um tipo de veículo. Adicione o bloco que corresponde ao veículo e deixe os outros slots como <Item type="NULL" />. O jogo ignora um bloco do tipo errado.

Tipo do blocoParaExemplos de campos
CCarHandlingDataCarrosfToeFront, fCamberFront, fCastor, fEngineResistance, strAdvancedFlags
CBikeHandlingDataMotos e bicicletasfMaxBankAngle, fWheelieBalancePoint, fInAirSteerMult, fJumpForce
CFlyingHandlingDataAviões e helicópterosfThrust, fYawMult, fRollMult, fPitchMult, fFormLiftMult
CBoatHandlingDataBarcosfBoxFrontMult, fAquaplaneForce, fRudderForce
CSpecialFlightHandlingDataModos de flutuação e voo em veículos terrestresmode, fMaxThrust, vecAngularDamping, strFlags
CSubmarineHandlingData, CTrailerHandlingData, CSeaPlaneHandlingData, CVehicleWeaponHandlingDataSubmarinos, trailers, hidroaviões, veículos armadosVelocidade de mergulho, limites de engate, flutuadores, limites de torreta

O handling de voo dos hoverboards da Nilo3D é feito assim, no arquivo de handling, sem script. No bloco de moto, os ângulos de inclinação e de equilíbrio são escritos em graus e convertidos para radianos ao carregar.

Os outros arquivos de que uma prancha precisa estão em como um hoverboard FiveM funciona sem script.

Como testar mudanças de handling?

Mude um valor por vez, reinicie o resource e dirija o mesmo trecho de rua antes de mudar o próximo. Guarde uma cópia da última versão que ficou boa. A entrada original de um veículo parecido é a melhor referência para saber se um valor está em uma faixa normal: o handling.meta do próprio jogo tem uma entrada para cada veículo original.

O handling só tem efeito quando a entrada está ligada do jeito certo: handlingName aqui, handlingId no vehicles.meta, e uma linha HANDLING_FILE no manifest, como mostrado em como adicionar um veículo add-on ao FiveM. Se o veículo não reage em nada às suas edições, veja a seção de handling do guia de solução de problemas.

Perguntas frequentes

Como aumentar a velocidade máxima no handling.meta?
Aumente o fInitialDriveMaxFlatVel, que está em km/h. O jogo usa esse valor vezes 1.2 no câmbio. Se o veículo para de acelerar antes de chegar lá, aumente o fInitialDriveForce ou diminua o fInitialDragCoeff.
Em que unidade está o fInitialDriveMaxFlatVel?
Quilômetros por hora. Ao carregar, o jogo multiplica o valor por 1000/3600 para chegar a metros por segundo.
Como deixar um carro com tração nas quatro rodas?
Coloque o fDriveBiasFront entre 0.1 e 0.9. 0.5 divide a tração por igual. Abaixo de 0.1 o jogo trata o carro como tração traseira e acima de 0.9 como tração dianteira.
Por que meu handling.meta não muda nada?
Ou o handlingName não bate com o handlingId do vehicles.meta, ou o arquivo não é carregado com uma linha data_file HANDLING_FILE, ou outro resource define o mesmo handlingName. Dê a cada veículo add-on um nome de handling único.
Como escrever as flags de handling?
Some os valores hexadecimais das flags que você quer e escreva a soma sem o 0x. Por exemplo, 0x10 + 0x40000 + 0x400000 se escreve 440010.

Fontes

Produtos deste guia

Todos os guias