[ESX] MSK Handcuffs - Realistic Handcuffs

Tebex [7.99€ incl. VAT] - about 80% is encrypted
Tebex [14.99€ incl. VAT] - about 10% is encrypted

YouTube Preview - [OUTDATED]


  • Cuff and Uncuff Players with Animations and Props
  • Hardcuff a Player (Player can’t move)
  • Drag and Undrag Player
  • Put Player in/out vehicle
  • AnkleTracker
  • Headbag
  • Cuff, uncuff, etc. players with items
  • Timer for uncuff players automatically
  • Admin commands
  • Cuff Status will be saved to database and restored after relog
  • Example to implement this in esx_policejob [Read the Documentation]
  • Discord Logs
  • All data will be saved in a database.json file in msk_handcuffs folder


Config = {}
Config.Locale = 'de'
Config.Debug = true
Config.VersionChecker = true
-- Add the Webhook Link in server_discordlog.lua
Config.DiscordLog = true
Config.botColor = "6205745" -- https://www.mathsisfun.com/hexadecimal-decimal-colors.html
Config.botName = "MSK Scripts"
Config.botAvatar = "https://i.imgur.com/PizJGsh.png"
-- !!! This function is clientside AND serverside !!!
Config.Notification = function(source, message, info)
    if IsDuplicityVersion() then -- serverside
        MSK.Notification(source, 'MSK Handcuffs', message, info)
    else -- clientside
        MSK.Notification('MSK Handcuffs', message, info)
-- You have to use 'cuffItems' before you can use 'hardcuffItems'

Config.cuffItems = {'cuffs', 'cable_ties'} -- DisableAllControlActions exept Movement 
Config.hardcuffItems = {'hardcuff'} -- Freeze Player Position
Config.uncuffItems = {'cuff_keys', 'scissors'}

Config.ItemSettings = {
    -- ['cuff_item'] = {'uncuff_item_1', 'uncuff_item_2', ...}
    -- You can only uncuff someone with 'uncuff_item' item if the player was cuffed with the 'cuff_item'
    -- Please don't add hardcuffItems, ankletracker or headbag here!

    ['cuffs'] = {'cuff_keys'},
    ['cable_ties'] = {'scissors'},
Config.AnkleTracker = {
    enable = true,
    refreshTime = 5.0, -- in seconds // Refreshtime if player is not in OneSync distance // If player is in OneSync Distance then the player will be refreshed realtime
    item = 'ankletracker', -- Use this item to activate and deactivate
    blip = {id = 1, color = 15, scale = 0.8},
    jobs = {
        -- Jobs who can see the Players with an ankletracker
Config.HeadBag = {
    enable = true,
    item = 'headbag', -- Use this item to put on and put off the headbag
Config.addCuffItems = true -- Set to false if you don't want to give the cuffs item back if you uncuff someone

-- Check status from DB on PlayerLoaded / Player joined server
Config.checkOnPlayerLoaded = {
    cuff = true, -- recommend set true
    hardcuff = false,
    ankleTracker = true, -- recommend set true
    headbag = false,

Config.playSound = {
    enable = true, -- Play sound on cuff and uncuff

    -- Add your own sounds here // Upload them into html/sounds
    cuff = 'cuff.ogg',
    hardcuff = 'cuff.ogg',
    uncuff = 'uncuff.ogg',
    ankleTracker = 'cuff.ogg',
    headBag = false,

Config.Timer = {
    enable = true, -- Set false to disable this feature
    time = 30 -- in minutes // After this time the player gets uncuffed
-- Admin Commands
Config.AdminGroups = {'superadmin', 'admin'} -- You can set multiple groups

Config.AdminCommands = {
    cuff = {
        enable = true,
        command = 'adcuff', -- /adcuff playerID
        playAnimation = false
    hardcuff = {
        enable = true,
        command = 'adhardcuff' -- /adhardcuff playerID
    uncuff = {
        enable = true,
        command = 'aduncuff' -- /aduncuff playerID
    ankleTracker = {
        enable = true,
        command = 'adankletracker' -- /adankletracker playerID
    headbag = {
        enable = true,
        command = 'adheadbag' -- /adheadbag playerID
-- To deactivate the Radio Channel if someone is handcuffed
Config.Voice = {
    enable = false, -- Set true to activate this Feature
    voice = 'salty' -- Set to 'salty' or 'pma'

Config.SetRadioChannel = function()
    if not Config.Voice.enable then return end

    if Config.Voice.voice == 'salty' then
        exports["saltychat"]:SetRadioChannel('0', true) -- https://github.com/v10networkscom/saltychat-fivem#setradiochannel
    elseif Config.Voice.voice == 'pma' then
        exports["pma-voice"]:setVoiceProperty('radioEnabled', false) -- https://github.com/AvarianKnight/pma-voice/blob/main/docs/client-setters/setVoiceProperty.md
        exports["pma-voice"]:SetRadioChannel(0) -- https://github.com/AvarianKnight/pma-voice/blob/main/docs/client-setters/setRadioChannel.md
-- !!! This function are clientside ONLY and inside a Thread (triggerd every frame) !!!
Config.Method = 'whitelist' -- Set to 'whitelist' or 'blacklist'

-- This is triggerd if the player gets cuffed
Config.Handcuffed = function()
    if Config.Method == 'whitelist' then
        EnableControlAction(0, 1, true) -- Camera Movement
        EnableControlAction(0, 2, true) -- Camera Movement
        EnableControlAction(0, 245, true) -- T (Chat)
        EnableControlAction(0, 23, true) -- F (Enter Vehicle)
        EnableControlAction(0, 75, true) -- F (Exit Vehicle)
    elseif Config.Method == 'blacklist' then
        DisableControlAction(0, 24, true) -- Attack
		DisableControlAction(0, 257, true) -- Attack 2
		DisableControlAction(0, 25, true) -- Aim
		DisableControlAction(0, 263, true) -- Melee Attack 1
        DisableControlAction(0, 45, true) -- Reload

		DisableControlAction(0, 22, true) -- Jump
		DisableControlAction(0, 44, true) -- Cover
		DisableControlAction(0, 37, true) -- Select Weapon

		DisableControlAction(0, 288,  true) -- F1
		DisableControlAction(0, 289, true) -- F2
		DisableControlAction(0, 170, true) -- F3
		DisableControlAction(0, 167, true) -- F6 
        DisableControlAction(0, 73, true) -- X
		DisableControlAction(2, 199, true) -- P
        -- DisableControlAction(0, 245, true) -- T (Chat)
        -- DisableControlAction(0, 23, true) -- F (Enter Vehicle)
        -- DisableControlAction(0, 75, true) -- F (Exit Vehicle)

        DisableControlAction(0, 59, true) -- Disable steering in vehicle
		DisableControlAction(0, 71, true) -- Disable driving forward in vehicle
		DisableControlAction(0, 72, true) -- Disable reversing in vehicle

        DisableControlAction(2, 36, true) -- Disable going stealth
        DisableControlAction(0, 47, true)  -- Disable weapon
		DisableControlAction(0, 264, true) -- Disable melee
		DisableControlAction(0, 257, true) -- Disable melee
		DisableControlAction(0, 140, true) -- Disable melee
		DisableControlAction(0, 141, true) -- Disable melee
		DisableControlAction(0, 142, true) -- Disable melee
		DisableControlAction(0, 143, true) -- Disable melee
Code is accessible No
Subscription-based No
Lines (approximately) ~1.200
Requirements ESX Legacy, msk_core
Support Yes

My other Scripts




Question: Does this make the ped like an entity? Like other handcuffs, which nullifies all ped based commands?

No, the Ped is still a Ped not an entity.

Option to disable the animation in the config would be nice and can you make the message editable because in my case okokNotify dont support colors in the message (f.e. ~r~) and they are set in the encrypted files atm.

So far nice scipt and working very well.

1 Like

No, the Translations are in translation.lua you can access this file

Why not use statebag for this? No need database request.

You should add config for disablecontrolactions as you cant speak or do much when cuffed when you should be able to, also is there any chance to get a semi open source version so we can add minigames etc to the cuffing? Also not much info for the readme, its only for police but no just uncuff or cuff exports meaning you have to have the item

I will add a function where you can add the DisabledControlKeys by youself with the next Update. Sure you have to have the item to cuff or uncuff someone.

I mean like say for certain events where there is no player a that needs cuffs since its the event that triggers the event if that makes sense (eg jail script where you get sent and are in cuffs or something)

xPlayer.triggerEvent('msk_handcuffs:checkCuff', item, playerID)

Yeah but that requires a player to have the handcuffs, i mean an event that just handcuffs the player without needing another player to do it so i can trigger it without needing the cop player

Hello, I have some questions, I have been using the script and well, I leave you with a couple of questions

Is there a possibility that the handcuffed user can run or maybe be able to change it at will?

How can I move a handcuffed person? with esx_policejob it was not possible to move a handcuffed player.

1 Like

Question 1: With the latest Update you can add the Controls that you want to active in the config.lua

Question 2: You can use the export in the Readme.md and add it in your policejob. It’s all described in the Readme.md

1 Like

Thanks I will try!!!

still having issue’s with this, players that are not cuffed when flying out sometimes come back in cuffed

Great script, I found just one problem.
The chezza inventory uses the fivem keymapping feature.
Your any block and allowing just some keys doesnt work for me with fivem keymappings.
Players are still able to open the inventory and use for example the uncuff feature on another player.

Is it possible to fix that?

All Controls are disabled you can enable Controls in the config.

UIs like Inventory or Phone can’t be disabled with Controls. Therefore you have to use the exports and Callback described in Readme.md

how and i add in the new police ‘1.7.5’ for drag and others

read the readme.md