To begin, I’m aware that Seat.Occupant is not replicated. This being noted, the following doesn’t look like intended behavior so I’m reporting it as a bug.
This is a bug involving all seats and vehicle seats that always happens when correctly performed in studio or ingame. It affects all places where the required objects are present. To cause the bug:
- Sit in any seat or vehicle seat
- Run MoveTo() on the client to teleport your character off the seat
If SetPrimaryPartCFrame is used instead, your character remains seated and nothing unusual happens. Any teleportation executed by the server is also unaffected and correctly teleports the character.
At first everything seems normal from the affected player’s perspective until they try interacting with certain game objects. To the server and all other players, they appear to remain seated until being removed from the seat. I have not found a way to exit this state without killing or incapacitating the affected character such as by resetting. Characters in this state have been observed to:
- Be unable to exit the state on their own or sit in another seat
- Not trigger server Touched events, allowing them to safely walk on kill bricks
- Remain able to interact with other server objects such as click buttons
- Push unanchored parts and sometimes replicate such movements to the server
- Seemingly be capable of damaging NPCs with swords but not other players
Exploiters could use this bug to mask their position from the server and potentially interfere with the game by killing NPCs or activating objects they’re not meant to have access to while remaining undetected by other players and location based anticheat scripts.
Repro: repro.rbxl (88.8 KB)
Video: https://www.youtube.com/watch?v=SUqvX7Y7Xq8
To fix your game:
Developers can add Player.Character.Humanoid.Sit=false wait() before any MoveTo() run on the client.
This will not prevent exploiters from teleporting themselves on a hacked client to cause the bug.
To fix the bug:
Option 1: Remove NotReplicated from Seat.Occupant unless there is a technical reason for having it.
Option 2: Make MoveTo consistent with SetPrimaryPartCFrame and not teleport seated humanoids.
Option 3: Set Humanoid.Sit to false before teleporting as a default behavior of MoveTo.
These are only suggestions and there may be other ways to fix it. Edit: Post rewritten for brevity