Moving player position on client also moves on the server

Hello, I’m using remote events to communicate between client and server, and for some reason when i set the client’s CFrame it also occurs for the server too, despite none of my server scripts changing position or CFrame. All the server script does is change the character’s appearance. I’d be thankful if somebody could tell me why exactly this is occuring.

LocalScript changing CFrame:

PlayerCharacter.PrimaryPart.CFrame = CFrame.new(CharacterSpawn.Position + Vector3.new(0,3,0))
PlayerCharacter.PrimaryPart.CFrame = CFrame.lookAt(PlayerCharacter.PrimaryPart.Position, Vector3.new(744.4, 5.607, 366.559))

Your client has network ownership of your character. Any changes made to the physics of your character will be replicated to the server.

1 Like

What is network ownership? (charlimit)

NetworkOwnership is used to determine which parts and their physics the client (your computer) should render and handle, and which parts and their physics the server (Roblox) should handle. All of the parts around the player are set to their NetworkOwnership by default, however you can manually change this. Anything far away from a player is set to the server.

NetworkOwnership

1 Like

It is inefficient for the server to handle all physics. A physics part network owner is either nil (server has network ownership) it a player instance (that player can control the physics of that part). This is why speed and teleport exploits work, the server has no real control over a character as the client can override any changes.

This is because the movement of unanchored parts (which includes the limbs, accessories, tools of the player’s character model) replicates to the server even if performed from the client-side through a local script.