Issue
Traction loss fires when the car goes airborne. With no ground resistance,
driven wheels spin up and the sim's slip value reads high even though no
traction is being lost. The effect takes the max slip across all four wheels
(AC: wheelSlip[], Forza: TireCombinedSlip[]), so a single unloaded wheel
(full jump or one-wheel lift over a crest/kerb) triggers it. The effect
should not fire from being airborne.
AC detail: a wheel that loses ground contact stops updating its wheelSlip[]
entry; it stays frozen at its last value until that wheel lands. Content
Manager detects airborne/wheelies from exactly this (gro-ove/actools
SessionStats.cs), and the same freeze is the recommended fix for airborne
detection in #31.
Test
Disable airborne ducking. Enable only traction loss. Jump.
In AC and Forza Horizon 6 (both output per-wheel slip telemetry):
- Before fix: buzz while airborne. (If no buzz, re-triage this issue.)
- After fix: silent while airborne; real wheelspin, lockup, and slides still
trigger traction loss haptics.
In a generic SimHub title (e.g. Wreckfest 2): no per-wheel slip telemetry
there, the effect uses its heuristic instead, so behavior should be unchanged
by this fix. Its mid-air false triggers are tracked in #34.
Fix
Replace the max-slip-across-all-four-wheels value the effect currently uses
with a load-weighted average: sum(slip_i x load_i) / sum(load_i). An unloaded
wheel then contributes nothing (fixes airborne and one-wheel lifts), a single
slipping wheel contributes its load share of the car's grip, and a four-wheel
slide reads full strength. AC exposes per-wheel wheelLoad[]; Forza's
per-wheel suspension travel works as the load proxy.
AC: additionally force a wheel's weight to zero when its wheelSlip[] entry is
frozen (bit-identical to the previous physics frame, speed-gated); a frozen
entry means that wheel is fully off the ground and its slip value is stale
(see the AC detail above). This keeps the fix correct even if wheelLoad
misbehaves on contact loss.
If all four loads read ~0 while slip is nonzero (field not populated), fall
back to the current unweighted value rather than going silent.
Games without per-tire slip keep the current heuristic fallback path.
Related: #31, #33, #34, #35.
Issue
Traction loss fires when the car goes airborne. With no ground resistance,
driven wheels spin up and the sim's slip value reads high even though no
traction is being lost. The effect takes the max slip across all four wheels
(AC: wheelSlip[], Forza: TireCombinedSlip[]), so a single unloaded wheel
(full jump or one-wheel lift over a crest/kerb) triggers it. The effect
should not fire from being airborne.
AC detail: a wheel that loses ground contact stops updating its wheelSlip[]
entry; it stays frozen at its last value until that wheel lands. Content
Manager detects airborne/wheelies from exactly this (gro-ove/actools
SessionStats.cs), and the same freeze is the recommended fix for airborne
detection in #31.
Test
Disable airborne ducking. Enable only traction loss. Jump.
In AC and Forza Horizon 6 (both output per-wheel slip telemetry):
trigger traction loss haptics.
In a generic SimHub title (e.g. Wreckfest 2): no per-wheel slip telemetry
there, the effect uses its heuristic instead, so behavior should be unchanged
by this fix. Its mid-air false triggers are tracked in #34.
Fix
Replace the max-slip-across-all-four-wheels value the effect currently uses
with a load-weighted average: sum(slip_i x load_i) / sum(load_i). An unloaded
wheel then contributes nothing (fixes airborne and one-wheel lifts), a single
slipping wheel contributes its load share of the car's grip, and a four-wheel
slide reads full strength. AC exposes per-wheel wheelLoad[]; Forza's
per-wheel suspension travel works as the load proxy.
AC: additionally force a wheel's weight to zero when its wheelSlip[] entry is
frozen (bit-identical to the previous physics frame, speed-gated); a frozen
entry means that wheel is fully off the ground and its slip value is stale
(see the AC detail above). This keeps the fix correct even if wheelLoad
misbehaves on contact loss.
If all four loads read ~0 while slip is nonzero (field not populated), fall
back to the current unweighted value rather than going silent.
Games without per-tire slip keep the current heuristic fallback path.
Related: #31, #33, #34, #35.