local Players = game:GetService("Players") local RunService = game:GetService("RunService") local ReplicatedStorage = game:GetService("ReplicatedStorage") local HandcuffEvent = ReplicatedStorage:WaitForChild("RemoteEvent"):WaitForChild("Handcuff"):WaitForChild("HandcuffEvent") local CUFF_OFFSET = CFrame.new(0, 0, -3) local MAX_CUFF_DISTANCE = 10 local cuffedPlayers = {} local animationTracks = {} local function cleanupCuff(suspectChar) if not cuffedPlayers[suspectChar] then return end if animationTracks[suspectChar] then animationTracks[suspectChar]:Stop() animationTracks[suspectChar]:Destroy() animationTracks[suspectChar] = nil end local humanoid = suspectChar:FindFirstChildOfClass("Humanoid") local player = Players:GetPlayerFromCharacter(suspectChar) if humanoid then humanoid.PlatformStand = false end if player then local rootPart = suspectChar:FindFirstChild("HumanoidRootPart") if rootPart then rootPart:SetNetworkOwner(player) end end cuffedPlayers[suspectChar] = nil end HandcuffEvent.OnServerEvent:Connect(function(copPlayer, targetPlayer) if not copPlayer or not targetPlayer then return end local copChar = copPlayer.Character local suspectChar = targetPlayer.Character if not copChar or not suspectChar then return end if cuffedPlayers[suspectChar] then cleanupCuff(suspectChar) print(targetPlayer.Name .. " has been uncuffed by " .. copPlayer.Name) return end local copRoot = copChar:FindFirstChild("HumanoidRootPart") local suspectRoot = suspectChar:FindFirstChild("HumanoidRootPart") local suspectHumanoid = suspectChar:FindFirstChildOfClass("Humanoid") if not copRoot or not suspectRoot or not suspectHumanoid then return end if suspectHumanoid:GetState() == Enum.HumanoidStateType.Dead then return end if (copRoot.Position - suspectRoot.Position).Magnitude > MAX_CUFF_DISTANCE then return end print(copPlayer.Name .. " is cuffing " .. targetPlayer.Name) suspectRoot:SetNetworkOwner(nil) suspectHumanoid.PlatformStand = true local animation = script:FindFirstChild("Animation") if animation then local track = suspectHumanoid:LoadAnimation(animation) track.Looped = true track.Priority = Enum.AnimationPriority.Action track:Play() animationTracks[suspectChar] = track end cuffedPlayers[suspectChar] = copChar end) RunService.Heartbeat:Connect(function(deltaTime) for suspectChar, copChar in pairs(cuffedPlayers) do if not (suspectChar and suspectChar.Parent and copChar and copChar.Parent) then cleanupCuff(suspectChar) continue end local copRoot = copChar:FindFirstChild("HumanoidRootPart") local suspectRoot = suspectChar:FindFirstChild("HumanoidRootPart") if not (copRoot and suspectRoot and copRoot.Parent and suspectRoot.Parent and suspectChar.Humanoid.Health > 0) then cleanupCuff(suspectChar) continue end local targetCFrame = copRoot.CFrame * CUFF_OFFSET suspectRoot.CFrame = targetCFrame end end) Players.PlayerRemoving:Connect(function(player) local char = player.Character if char then if cuffedPlayers[char] then cleanupCuff(char) end for suspectChar, copChar in pairs(cuffedPlayers) do if copChar == char then cleanupCuff(suspectChar) end end end end)