Character with ControllerManager can't recover from NaN velocity on client, resulting in softlock

When a character that has a ControllerManager has its assembly velocity set to NaN (e.g. from zero division, getting the unit vector of a blank vector, physics errors, etc), the humanoid can’t recover in the same way that a regular humanoid normally can, and instead locks all sensors and locks the active controller with the server holding its network ownership. This is not an issue with Humanoid.EvaluateStateMachine and is caused by the ControllerManager itself.

After a while, if Workspace.StreamingEnabled is true and if Workspace.StreamingIntegrityMode isn’t set to Disabled, the player will get stuck in the gameplay paused state, fully softlocking the client. If Workspace.StreamOutBehavior is set to Opportunistic, the softlock occurs much more quickly and everything affected by streaming will completely unload.

Repro

  1. Enable StreamingEnabled if it isn’t on already
  2. Set Workspace.StreamingIntegrityMode to anything but Disabled and Workspace.StreamOutBehavior to Opportunistic for “best” results
  3. Set up a character with a ControllerManager with whatever configuration (RootPart and ActiveController must be set)
  4. On the client, set the assembly’s linear or angular velocity to NaN (for example, run game.Players.LocalPlayer.Character.HumanoidRootPart.AssemblyLinearVelocity /= 0

Demonstration

Normal behaviour (no ControllerManager)

Broken behaviour (with ControllerManager, StreamOutBehavior: Opportunistic, StreamingIntegrityMode: PauseOutsideLoadedArea)

Place files

With ControllerManager:
controllertest.rbxl (55.6 KB)
Place used for without controllermanager is a default baseplate

5 Likes

This is just an acknowledgment announcement!

We’ve filed a ticket into our internal database for this issue, and we will update you when we have further information!

Thanks for the report!

1 Like

@nothing_1649 for step 3 in the repro, what does “ActiveController” need to be set to? Also, if you could provide a repro file that is already set with these settings and we just need to run the command that would also be helpful

using the repro file i posted here, seems like ActiveController is set to a GroundController at the time the velocity is applied, however now i’m getting slightly different behaviour where the player can still move but isn’t able to change state and it seems to be desynced between the server and client; the behaviour for without a ControllerManager seems to be identical to before

the gameplay paused screen now flashes randomly and i only encountered the softlock when standing still for a while, this may be caused by the camera’s focus being set to nan

as for a repro file the one provided in the post seems to repro without any changes even without any beta features enabled