Sounds
In a pack: the engine and sounds sections of vehicles/<name>.json (format: the Vehicle Packs page), the sound events in the pack's assets/<id>/sounds.json; without them, the T15's diesel. What each sound is, in the Java form:
.sounds(new VehicleType.EngineSounds(
MySounds.IDLE, MySounds.MID, MySounds.LOAD, MySounds.COAST, // loops: idle, mid revs, on the throttle, off it
MySounds.CRANK, MySounds.START, MySounds.STOP, MySounds.KEY, // starter, catching, stopping, the key
null)) // a diesel's glow-plug relay click; null for petrolEach is a sound (in Java a Supplier<SoundEvent>, registered with a DeferredRegister<SoundEvent>; in a pack "<pack>:<event>"). Loops must loop seamlessly, mono.
An rpm ladder (recommended for sports cars): with a set of steady takes at different engine speeds, use EngineSounds.ladder. Vettura crossfades the two takes either side of the engine speed, each pitched from its own; on with the throttle down, off coasting:
List<EngineSounds.Step> on = List.of(new EngineSounds.Step(MySounds.ON_1170, 1170), new EngineSounds.Step(MySounds.ON_1410, 1410), ...);
List<EngineSounds.Step> off = ...; // the same speeds, off-throttle takes
.sounds(EngineSounds.ladder(on, off, VetturaSounds.TRUCK_CRANK, MySounds.START, MySounds.STOP, VetturaSounds.TRUCK_KEY,
new double[]{-1.0, 0, 0.6})) // where the engine is: forward, right, up (m); a mid engine sits behind the cabTakes of 2–4 s each, in rising order, neighbours no more than 1.3 times apart (more pitching sounds wrong). The lowest is also the idle.
Starting: the starter (the third argument) is a loop, played as long as the starter turns; the steady part of a real starter recording is best. The catch is either a recorded one-shot (start), or start null and a startFlare in the physics: the engine really flares and settles, heard from the ladder itself (recommended for a sports car, as BeamNG does it). In a pack's JSON: "start": null.

