Additionaly to the methods by @GFXBIT, you can instead use a RemoteEvent and fire it to the client with an argument stating whether the player is being currently cuffed or uncuffed. Once the client receives it, make a function to disable the player’s controls via the PlayerModule’s Controller. You can see more on it in this post.
But summed up quickly, make a LocalScript and in it, define the variable where you require the Controller:
local Controller = require(game:GetService(“Players”).PlayerScripts.PlayerModule):GetControls()
Then add:
yourEventHere.OnClientEvent:Connect(function(stateRequired)
if stateRequired == "cuff" then
Controller:Disable()
elseif stateRequired == "uncuff" then
Controller:Enable()
end
end)
However, note that as with any other method for stopping a player’s movement ability (except anchoring them for example, in which case they could move only client-side), you cannot stop an exploiter this way from them re-enabling their controls. This is because a player has full control of their client, of course.
Anyway, after the code above, you can move the player using :MoveTo() freely.
I hope this solves your issue. Let me know if you have any questions and good luck!