Dano de veículo FiveM: saúde do motor, saúde da carroceria e ajustes de handling

Como o dano de veículo funciona no FiveM: os intervalos de saúde do motor, carroceria e tanque de gasolina, GetVehicleEngineHealth, multiplicadores de dano de handling e como funcionam scripts de dano realista.

Sintomas típicos:

text
Cars lose their engine after a small bump, explode when someone lightly hits a wall, or never take damage at all.

Dano no GTA é um punhado de valores de saúde por veículo, e alguns números de handling que escalam a rapidez com que caem. Este artigo dá os intervalos, os natives, os valores de handling e a ideia por trás de scripts de dano realista.

Os valores de saúde

Um veículo tem vários valores de saúde que você pode ler e escrever no cliente:

Valor Intervalo Ler com
Saúde do motor -4000 a 1000 GetVehicleEngineHealth
Saúde da carroceria 0 a 1000 GetVehicleBodyHealth
Saúde do tanque de gasolina 0 a 1000 GetVehiclePetrolTankHealth

Um carro novo está em 1000.0 em todos os três. O motor é o incomum porque vai abaixo de zero:

  • Em 1000, o motor está saudável.
  • Conforme o valor cai, o carro fuma e perde potência.
  • Em 0 e abaixo, o motor está morto e o carro pode pegar fogo. O intervalo desce até -4000.
lua
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)

print('engine', GetVehicleEngineHealth(vehicle))
print('body', GetVehicleBodyHealth(vehicle))
print('tank', GetVehiclePetrolTankHealth(vehicle))

O tanque de gasolina importa para incêndios. Quando a saúde do tanque cai, pode vazar, e um tanque que vaza pode pegar fogo. O motor e o tanque são separados, então um motor em 1000 ainda pode queimar se o tanque for atingido.

Definindo os valores

Para reparar ou danificar um veículo, escreva os valores de volta:

lua
SetVehicleEngineHealth(vehicle, 1000.0)
SetVehicleBodyHealth(vehicle, 1000.0)
SetVehiclePetrolTankHealth(vehicle, 1000.0)

Para corrigir um veículo completamente, incluindo a deformação visível e a sujeira, há natives separados:

lua
SetVehicleFixed(vehicle)
SetVehicleDeformationFixed(vehicle)
SetVehicleDirtLevel(vehicle, 0.0)

SetVehicleFixed redefine a saúde e repara o modelo. SetVehicleDeformationFixed remove amassados. Use ambos para uma reparação completa.

Para salvar o dano de um carro possuído, armazene os valores com as outras propriedades, veja propriedades do veículo. Se não fizer, cada carro sai da garagem totalmente reparado.

Dica: um veículo que para de uma vez e não inicia novamente geralmente tem uma saúde do motor abaixo de 0. Definir de volta a um valor como 400.0 o traz de volta sem uma reparação completa, que é o que muitos scripts de mecânico fazem. Veja também o trabalho de mecânico.

Multiplicadores de handling

A rapidez com que os valores caem é decidida pelo handling do veículo. Três deles são os nós usuais:

Valor de handling Efeito
fCollisionDamageMult O quanto uma colisão danifica a carroceria e o motor
fDeformationDamageMult O quanto uma colisão deforma o modelo, os amassados visíveis
fEngineDamageMult O quanto de dano o motor sofre

Um valor de 1.0 é neutro, menor significa menos dano e maior significa mais. Em um handling.meta ficam assim:

xml
<fCollisionDamageMult value="0.700000" />
<fDeformationDamageMult value="0.700000" />
<fEngineDamageMult value="1.500000" />

Pequenas mudanças fazem um longo caminho, então mude por décimos. Para onde o arquivo vive e como aplicar a mudança, veja editando handling do veículo. Os mesmos valores podem ser alterados em tempo de execução com SetVehicleHandlingFloat, que afeta um veículo:

lua
SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fCollisionDamageMult', 0.7)

Mudanças em tempo de execução se aplicam a aquele veículo enquanto existe. Reaplicar cada vez que spawna.

Scripts de dano realista

Scripts de dano não mudam o motor do jogo, usam os valores acima. O conceito é simples:

  1. Um loop lê a saúde do motor e carroceria do veículo que o jogador dirige.
  2. Quando os valores caem abaixo de limites definidos, o script aplica efeitos: menos potência com SetVehicleEnginePowerMultiplier, um motor que para, um steering que puxa, um aviso na tela.
  3. Ele mantém o motor de morrer completamente, por exemplo mantendo-o em um pequeno valor positivo, para que o carro manche em vez de queimar.
  4. Um mecânico ou um kit de reparo define os valores novamente.

O loop não precisa executar a cada frame. Uma verificação a cada alguns centena de milissegundos é suficiente e mais barata, veja como Wait funciona:

lua
CreateThread(function()
    while true do
        local ped = PlayerPedId()
        local vehicle = GetVehiclePedIsIn(ped, false)

        if vehicle ~= 0 and GetPedInVehicleSeat(vehicle, -1) == ped then
            if GetVehicleEngineHealth(vehicle) < 200.0 then
                SetVehicleEngineHealth(vehicle, 200.0)
                SetVehicleEngineOn(vehicle, false, true, true)
            end
            Wait(500)
        else
            Wait(1500)
        end
    end
end)

Isso mantém o motor de queimar, e o desliga em vez disso. Trate como um ponto de partida: um script real adiciona uma forma de reiniciar, para que o jogador não fique preso.

Prevenindo explosões

Se você apenas quer menos mortes por fogo, as opções seguras mais simples são as acima: um multiplicador de dano mais baixo, e manter a saúde do motor e do tanque de cair a zero.

Há também natives que desabilitam partes do sistema de fogo e explosão para um veículo, como aqueles que impedem o motor de degradar. Use-os em um veículo específico, como um veículo de job, e leia a documentação nativa antes de depender deles. Não os aplique a cada veículo no servidor:

  • Scripts como uma bomba de carro ou um heist dependem de veículos que podem explodir.
  • Jogadores usam dano em roleplay: uma perseguição, uma cena de crash, uma parada policial.
  • Um veículo que não pode ser destruído é uma ferramenta de griefing, e uma forma de evitar consequências.

Decida por caso de uso, e prefira os multiplicadores.

Dano após um restart ou um respawn

Se um carro é reparado toda vez que spawna, a causa é uma dessas:

  • A garagem não salva saúde do motor e carroceria, então cada spawn começa em 1000. Salve os valores ao armazenar e aplique no spawn.
  • Um script chama SetVehicleFixed em cada spawn.
  • O carro é uma entidade fresca, e sua saúde sempre começa cheia. Apenas seus dados salvos carregam dano.

Lista de verificação

Sintoma Solução
Preciso da saúde do motor GetVehicleEngineHealth, intervalo -4000 a 1000
Carro morre com a menor batida Abaixe fCollisionDamageMult e fEngineDamageMult no handling
Amassados muito visíveis Abaixe fDeformationDamageMult
Carro queima após um pequeno impacto Mantenha a saúde do tanque de gasolina, ou limite a queda do motor
Carro travado não inicia Defina a saúde do motor acima de 0
Reparo deixa amassados Adicione SetVehicleDeformationFixed após SetVehicleFixed
Dano perdido após armazenar Salve saúde do motor e carroceria com as outras propriedades

Respostas rápidas

Qual é o intervalo de saúde do motor do veículo?

De -4000 a 1000. Um motor saudável está em 1000. Abaixo de 0 o motor está morto, e o carro pode queimar.

Como fazer carros sofrerem menos dano?

Abaixe os multiplicadores de dano no handling do veículo, como fCollisionDamageMult e fDeformationDamageMult, ou mantenha os valores de saúde completos de um script.

Posso impedir que veículos explodam?

Você pode reduzir mantendo os valores de saúde ou mudando o handling, mas tenha cuidado: uma configuração geral remove uma parte do jogo que outros scripts, como um heist ou uma bomba de carro, podem precisar.

Scripts sem esse problema

Advanced BoostingBoosting de veículos pelo tablet: contratos da classe D à S+, crews e fila ao vivo.Ver script →Car BombPlante, detecte e desarme bombas em veículos — com celular detonador e minigame de C4.Ver script →Chameleon Paints82 pinturas camaleão que mudam de cor, num menu de um clique.Ver script →

Continue lendo