When a character with a Humanoid is placed on a CylindricalConstraint joint with no network ownership, the character is applied with a small velocity in a random direction. This small velocity is powerful enough to move the player / NPC in random directions. This only happens when the humanoid rig does not have the same network ownership as the CylindricalConstraint joint.
Reproduction Steps
In a studio file, create two parts.
Attach a CylindricalConstraint to the two parts.
Using a script, set the network ownership of one of the parts to nil. script.Parent:SetNetworkOwnership(nil).
With your character or a rig with network ownership set to you, stand on one of the two parts.
You will notice the character and/or rig is moving in a random direction.
This only applies to Humanoid rigs, not other parts that are owned by the Player. This leads me to believe it is a Humanoid-specific issue.
Expected Behavior
The character should not be applied with a random velocity.
Actual Behavior
The character is applied with a velocity in a random direction.
Workaround
For my situation, I have to have the same network ownership for the joint and player. This is not optimal, as there are other players in a session.
Issue Area: Engine Issue Type: Physics Impact: Low Frequency: Often Date First Experienced: 2023-01-29
The Physics team has looked into this report, and it seems like this isn’t a physics issue but rather one that involves networking. We are still looking into how one might go about fixing or circumventing this issue, and will report back when we have more information.
Upon more investigation, we’ve realized that the behavior you’re experiencing can be circumvented with the new character controller, see Releasing Character Physics Controllers for more details.
This behavior is likely happening because of network ownership and Humanoid logic. In the repro file, when the box is in its red-outline state, it seems like the client and server flip-flop in who is responsible for simulating the part. Then, because of the bespoke logic that the Humanoid has with respect to interactions with the floor below it, interpolation between client and and server is producing inconsistent values of velocity from the last time that client had responsibility of simulating the part, which is likely causing the drift that we observe.
The new character controller, see Releasing Character Physics Controllers, doesn’t exhibit the same behavior because it doesn’t implement any of the same bespoke logic mentioned earlier. Instead, it is comprised entirely of constraints, and takes advantage of all existing physics logic, so interactions between the new character controller and the floor are identical to all other interactions.