Vehicles used to have different sounds if the Engine failed to start, depending on if a Spark Plug, a Battery or fuel was missing.
This is not the case anymore, but i think it's not intended as the functionality is still there, just never executes since it's getting called on Server only.
I already made a fix for that, but maybe you guys can come up with a better or more slick solution.
override bool OnBeforeEngineStart() { EntityAI item = null; CarEngineSoundState state; Param1<int> newState; if ( IsVitalAttachmentDamaged() ) { state = CarEngineSoundState.NONE; newState = new Param1<int>( state ); GetGame().RPCSingleParam(this, RPC_CARFAIL, newState, true); return false; } if (GetFluidFraction(CarFluid.FUEL) <= 0) { state = CarEngineSoundState.START_NO_FUEL; newState = new Param1<int>( state ); GetGame().RPCSingleParam(this, RPC_CARFAIL, newState, true); return false; } if (IsVitalCarBattery() || IsVitalTruckBattery()) { item = GetBattery(); if (!item || (item && (item.IsRuined() || item.GetCompEM().GetEnergy() < m_BatteryEnergyStartMin))) { state = CarEngineSoundState.START_NO_BATTERY; newState = new Param1<int>( state ); GetGame().RPCSingleParam(this, RPC_CARFAIL, newState, true); return false; } } if (IsVitalSparkPlug()) { item = FindAttachmentBySlotName("SparkPlug"); if (!item || (item && item.IsRuined())) { state = CarEngineSoundState.START_NO_SPARKPLUG; newState = new Param1<int>( state ); GetGame().RPCSingleParam(this, RPC_CARFAIL, newState, true); return false; } } if (IsVitalGlowPlug()) { item = FindAttachmentBySlotName("GlowPlug"); if (!item || (item && item.IsRuined())) { state = CarEngineSoundState.START_NO_SPARKPLUG; newState = new Param1<int>( state ); GetGame().RPCSingleParam(this, RPC_CARFAIL, newState, true); return false; } } if (!m_EngineBeforeStart) { m_EngineBeforeStart = true; HandleEngineSound(CarEngineSoundState.STARTING); } return true; } override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx) { super.OnRPC(sender, rpc_type,ctx); switch (rpc_type) { case RPC_CARFAIL: { Param1<int> carfail_params; if (!ctx.Read(carfail_params)) { break; } switch (carfail_params.param1) { case CarEngineSoundState.START_NO_FUEL: PlayCarFailNoFuel(); break; case CarEngineSoundState.START_NO_BATTERY: PlayCarFailNoBattery(); break; case CarEngineSoundState.START_NO_SPARKPLUG: PlayCarFailNoSparkPlug(); break; case CarEngineSoundState.NONE: PlayCarFailNoSparkPlug(); break; } } } }
On top of that i found that almost all Vanilla Vehicles have their
engine_failed_start_battery_SoundShader
volume=0