Hi CheesyFX, thanks for BodyLanguage! A report about Freeze Motion/Sound in v71 (the latest on the Hub). The main paths (PoseMe → Gaze, PoseIdle, Magnet, the shakers, the force AddForce calls) already respect
SuperController.singleton.freezeAnimation, but quite a few things keep running while frozen.
1. Ahegao head torque ignores freeze (operator precedence)
src/ReadMyLips/Ahegao.cs, FixedUpdate, line 219:
C#:
if(!Pose.isApplying || ahegaoHeadEnabled.val && !SuperController.singleton.freezeAnimation) head.AddRelativeTorque(headTorque);
&& binds tighter than
||, so whenever no pose is being applied the head is pushed even while frozen, and even with "Ahegao Head Enabled" off. Measured in game: during an orgasm, 200
AddRelativeTorque calls in 5 s of freeze; with all
&&, 0.
RelativeForce /
RelativeTorque have the same pattern (they look unused, though).
2. Pose.GetPose() clears the user's freeze
Storing a pose freezes for 0.6 s and then always unfreezes, so if the scene was already frozen, saving a pose unfreezes it. Restoring the previous state at the end would fix it.
3. Things that keep running while frozen (found by reading the source, not each one tested):
- Sounds: Orifice.FixedUpdate calls PlayMoan / PlayBurstMoan every step; the squish and slap sounds. AudioSources and ParticleSystems the plugin creates itself (orifice / throat / slap audio, cum and expression particles) keep playing. VaM only pauses its own head audio source.
- Morphs and timers: FillMeUp.Update (belly / throat bulge), the Anus / Vagina / Throat / Hand / Cleavage FixedUpdates (gape, in-out, twink and relaxation timers), Ahegao.Update (eyes, tongue), LerpingMorph / LerpingFinger / BJHelper, NippleDriver, StimReceiver.Update (stim decay, load, Orgasm()).
- Orgasm entry points: ReadMyLips.ForceOrgasm / ForceMaleOrgasm, StimReceiver.ForceOrgasm, the cum hotkey, and the orgasm action in Pose.Apply.
- Coroutines: the Zero* coroutines (they fire user triggers and AddTorque), Gaze.LerpGazeStrength, Dialog, Slap.InvokeTargeted, the cumshot / clothing routines, Person.StiffenCo.
- User triggers: BodyRegionTrigger / TouchTrigger / SlapTrigger / WatchTrigger / CustomFloatTrigger.Update, and touch / slap from OnCollisionEnter. Physics keeps stepping under freeze, so collisions still arrive.
- Half-guarded: Force.FixedUpdate skips AddForce but keeps advancing its phase and random timers. CircularForce keeps advancing its angle. Person / Dildo FixedUpdate keep changing joint springs, collider radius and mass. All of these jump a little on unfreeze.
- BreathingDriver does stop, but it calls Reset() every step while frozen, so the breathing morph snaps to zero at the moment of freezing.
How I handled it in a local patch, in case it's useful:
if (frozen) return; at the top of each per-frame entry, so timers don't advance and everything resumes where it was.
- A small coroutine wrapper that doesn't call MoveNext() while frozen, instead of .Start(). Not for the pose apply / store / load coroutines: GetPose waits for those during its own 0.6 s freeze.
- Pause the plugin's own AudioSources and ParticleSystems on freeze and resume them on unfreeze.
- Block the effects, not the bookkeeping: penetration and touch enter / exit are still registered, so the state matches after unfreezing.
With that, in the same test nothing BodyLanguage writes moved during freeze: 0 morph changes, 0 AudioSource.Play, head rotation ≤ 0.05°. After unfreezing, the orgasm animation continued instead of restarting. Happy to share the diff if you want it.