Daño de vehículo en FiveM: salud del motor, salud de la carrocería y ajustes de handling
Cómo funciona el daño del vehículo en FiveM: los rangos de salud del motor, la carrocería y el tanque de gasolina, GetVehicleEngineHealth, multiplicadores de daño de handling y cómo funcionan los scripts de daño realista.
Síntomas típicos:
Cars lose their engine after a small bump, explode when someone lightly hits a wall, or never take damage at all.El daño en GTA es un puñado de valores de salud por vehículo, y unos pocos números de handling que escalan qué tan rápido caen. Este artículo da los rangos, los nativos, los valores de handling y la idea detrás de los scripts de daño realista.
Los valores de salud
Un vehículo tiene varios valores de salud que puedes leer y escribir en el cliente:
| Valor | Rango | Leer con |
|---|---|---|
| Salud del motor | -4000 a 1000 | GetVehicleEngineHealth |
| Salud de la carrocería | 0 a 1000 | GetVehicleBodyHealth |
| Salud del tanque de gasolina | 0 a 1000 | GetVehiclePetrolTankHealth |
Un coche nuevo está en 1000.0 en los tres. El motor es el inusual porque baja de cero:
- En
1000, el motor es saludable. - A medida que el valor baja, el coche emite humo y pierde potencia.
- En
0y por debajo, el motor está muerto y el coche puede coger fuego. El rango baja a-4000.
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
print('engine', GetVehicleEngineHealth(vehicle))
print('body', GetVehicleBodyHealth(vehicle))
print('tank', GetVehiclePetrolTankHealth(vehicle))El tanque de gasolina importa para los incendios. Cuando la salud del tanque cae, puede fugar, y un tanque que fuga puede encenderse. El motor y el tanque son separados, así que un motor en 1000 aún puede quemar si el tanque es golpeado.
Establecer los valores
Para reparar o dañar un vehículo, escribe los valores de vuelta:
SetVehicleEngineHealth(vehicle, 1000.0)
SetVehicleBodyHealth(vehicle, 1000.0)
SetVehiclePetrolTankHealth(vehicle, 1000.0)Para reparar un vehículo completamente, incluyendo la deformación visible y la suciedad, hay nativos separados:
SetVehicleFixed(vehicle)
SetVehicleDeformationFixed(vehicle)
SetVehicleDirtLevel(vehicle, 0.0)SetVehicleFixed reinicia la salud y repara el modelo. SetVehicleDeformationFixed elimina abolladuras. Usa ambos para una reparación completa.
Para guardar el daño de un coche propiedad, almacena los valores con las otras propiedades, mira propiedades del vehículo. Si no lo haces, cada coche sale del garaje completamente reparado.
Consejo: un vehículo que se cala de inmediato y no arrancará de nuevo a menudo tiene una salud del motor bajo 0. Establecerla de nuevo a un valor como
400.0la devuelve sin una reparación completa, que es lo que muchos scripts de mecánico hacen. Mira también el trabajo de mecánico.
Multiplicadores de handling
Qué tan rápido caen los valores se decide por el handling del vehículo. Tres de ellos son los botones habituales:
| Valor de handling | Efecto |
|---|---|
fCollisionDamageMult |
Cuánto una colisión daña la carrocería y el motor |
fDeformationDamageMult |
Cuánto una colisión deforma el modelo, las abolladuras visibles |
fEngineDamageMult |
Cuánto daño recibe el motor |
Un valor de 1.0 es neutral, menor significa menos daño y mayor significa más. En un handling.meta se ven así:
<fCollisionDamageMult value="0.700000" />
<fDeformationDamageMult value="0.700000" />
<fEngineDamageMult value="1.500000" />Los pequeños cambios van muy lejos, así que muévete por décimos. Para saber dónde vive el archivo y cómo aplicar el cambio, mira editar handling de vehículo. Los mismos valores se pueden cambiar en tiempo de ejecución con SetVehicleHandlingFloat, que afecta un vehículo:
SetVehicleHandlingFloat(vehicle, 'CHandlingData', 'fCollisionDamageMult', 0.7)Los cambios en tiempo de ejecución se aplican a ese vehículo mientras existe. Reaplicar cada vez que se desova.
Scripts de daño realista
Los scripts de daño no cambian el motor del juego, usan los valores anteriores. El concepto es simple:
- Un bucle lee la salud del motor y la carrocería del vehículo que el jugador conduce.
- Cuando los valores caen por debajo de ciertos umbrales, el script aplica efectos: menos potencia con
SetVehicleEnginePowerMultiplier, un motor que se cala, un volante que tira, una advertencia en pantalla. - Mantiene el motor de morir completamente, por ejemplo manteniéndolo en un pequeño valor positivo, así que el coche cojea en lugar de quemarse.
- Un mecánico o un kit de reparación establece los valores de nuevo hacia arriba.
El bucle no tiene que ejecutarse cada frame. Una comprobación cada pocos cientos de milisegundos es suficiente y más barato, mira cómo funciona Wait:
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)Esto mantiene el motor de quemarse, y lo apaga en su lugar. Trátalo como un punto de partida: un script real añade una forma de reiniciarlo, para que el jugador no esté atrapado.
Prevenir explosiones
Si solo quieres menos muertes por fuego, las opciones seguras más simples son las anteriores: un multiplicador de daño más bajo, y mantener la salud del motor y el tanque de caer a cero.
También hay nativos que desactivan partes del sistema de incendios y explosiones para un vehículo, como los que detienen la degradación del motor. Úsalos en un vehículo específico, como un vehículo de trabajo, y lee la documentación del nativo antes de confiar en ellos. No los apliques a cada vehículo en el servidor:
- Scripts como una bomba de coche o un heist dependen de vehículos que pueden explotar.
- Los jugadores usan daño en roleplay: una persecución, una escena de choque, una parada de policía.
- Un vehículo que no se puede destruir es una herramienta de griefing, y una forma de evitar consecuencias.
Decide por caso de uso, y prefiere los multiplicadores.
Daño después de un reinicio o una reaparición
Si un coche es reparado cada vez que se desova, la causa es una de estas:
- El garaje no guarda la salud del motor y la carrocería, así que cada desove comienza en 1000. Guarda los valores al almacenar y aplícalos en el desove.
- Un script llama a
SetVehicleFixeden cada desove. - El coche es una entidad fresca, y su salud siempre comienza llena. Solo tus datos guardados llevan daño.
Lista de comprobación
| Síntoma | Solución |
|---|---|
| Necesito la salud del motor | GetVehicleEngineHealth, rango -4000 a 1000 |
| El coche muere al más leve golpe | Baja fCollisionDamageMult y fEngineDamageMult en handling |
| Las abolladuras demasiado visibles | Baja fDeformationDamageMult |
| El coche se quema después de un pequeño golpe | Mantén la salud del tanque de gasolina alta, o limita la caída del motor |
| Coche calado no arrancará | Establece la salud del motor por encima de 0 |
| La reparación deja abolladuras | Añade SetVehicleDeformationFixed después de SetVehicleFixed |
| Daño perdido después de almacenar | Guarda la salud del motor y la carrocería con las otras propiedades |
Respuestas rápidas
¿Cuál es el rango de salud del motor del vehículo?
De -4000 a 1000. Un motor saludable está en 1000. Bajo 0 el motor está muerto, y el coche puede quemarse.
¿Cómo hago que los coches reciban menos daño?
Baja los multiplicadores de daño en el handling del vehículo, como fCollisionDamageMult y fDeformationDamageMult, o mantén los valores de salud en su máximo desde un script.
¿Puedo impedir que los vehículos exploten?
Puedes reducirlo manteniendo los valores de salud altos o cambiando el handling, pero ten cuidado: una configuración general elimina una parte del juego que otros scripts, como un heist o una bomba de coche, pueden necesitar.
Scripts que evitan este problema
Advanced BoostingBoosting de vehículos desde una tablet: contratos de clase D a S+, crews y cola en vivo.Ver script →
Car BombColoca, detecta y desactiva bombas en coches — con detonador y minijuego de C4.Ver script →
Chameleon Paints82 pinturas camaleón que cambian de color, en un menú de un clic.Ver script →