Knovon HandCuff Tutorial

Hello everyone I am just making a tutorial on how to set up the Hnadcuff System for Knovon!

Please do the following:

--[[
Arrest folder goes in ServerScriptService
ArrestFolder folder goes in ServerStorage
Civs and Jail teams go in Teams
arrest folder goes in ReplicatedStorage
Handcuffs tool goes wherever you want
ArrestUi gui goes in StarterGui

other info:
you can't test in studio
turn on HTTP requests
settings are in the ArrestSettings module in the Arrest folder in ServerScriptService
]]

In Arrest folder go into Arrest > Arrest Settings type in the following:

local ArrestSettings = {
    MainSettings = {
        Permissions = {
            [Group Id] = {
                Rank Id,
                Rank Id, -- duplicate if needed
            },
        },
        DiscordWebhook = "", -- webhook to log arrest
        JailTeamColor = BrickColor.new("Deep orange"),
        CivilianTeamColor = BrickColor.new("Forest green"),
        MaxTime = 5000,
    },
    DataSettings = {
        DataStoreName = "ArrestStore",
        DataKey = "Key_"
    },
}

return ArrestSettings

Then go into Arrest > Arrest and type the following:

local HTTPService = game:GetService("HttpService")
local ArrestSettings = require(script.Parent.ArrestSettings)

local Permissions = ArrestSettings.MainSettings.Permissions

local function GetFolder(Player)
	if game.ServerStorage.ArrestFolder:FindFirstChild(Player.Name) then
		return game.ServerStorage.ArrestFolder:FindFirstChild(Player.Name)
	else
		return nil
	end
end

local Webhook = ArrestSettings.MainSettings.DiscordWebhook
local JailColor = ArrestSettings.MainSettings.JailTeamColor
local CivilianColor = ArrestSettings.MainSettings.CivilianTeamColor
local MaxTime = ArrestSettings.MainSettings.MaxTime

local function SendHTTP(Player, Message)
	local data = {
		content = Message;
		username = Player.Name;
		avatar_url = "http://www.roblox.com/Thumbs/Avatar.ashx?x=100&y=100&Format=Png&userId=" .. Player.UserId
	}
	HTTPService:PostAsync(Webhook, HTTPService:JSONEncode(data))
end

game.ReplicatedStorage.arrest.Arrest.OnServerEvent:Connect(function(Arrester, Time, Reason)
	if Arrester and Time and Reason then
		local ArresterFolder = GetFolder(Arrester)
		local Player = game.Players:GetPlayerByUserId(ArresterFolder.ArrestHolding.Value)
			if Player then
			local PlayerFolder = GetFolder(Player)
			if ArresterFolder and PlayerFolder then
				if tonumber(Time) and tostring(Reason) then
					if Time <= MaxTime then
						if ArresterFolder:FindFirstChild("ArrestHolding") then
							if ArresterFolder.ArrestHolding.Value == Player.UserId then
								Time = tonumber(Time)
								Reason = tostring(Reason)
								local Allowed = false
								for Group, PermissionsTable in pairs(Permissions) do
									for _, GroupRank in pairs(PermissionsTable) do
										print(Arrester:GetRankInGroup(Group))
										if Arrester:GetRankInGroup(Group) == GroupRank then
											Allowed = true
										end
									end
								end
								if Allowed == true then
									game.ReplicatedStorage.arrest.GiveArrestUi:FireClient(Arrester, " ", false)
									ArresterFolder.ArrestHolding:Destroy()
									Player.Character.Torso.Anchored = false
									SendHTTP(Arrester, (tostring(Arrester.Name) .. " has arrested ".. tostring(Player.Name) .. " for ".. tostring(Reason) .. " and ".. tostring(Time) .. " time."))
									if PlayerFolder:FindFirstChild("JailTime") then
										PlayerFolder.JailTime.Value = Time
										Player.TeamColor = JailColor
										Player:LoadCharacter()
									end
									local TempFolder = game.ServerStorage:FindFirstChild(Player.Name .. "'s inventory")
									if TempFolder then
										TempFolder:Destroy()
									end
								end
							end
						end
					end
				end
			end
		end
	end
end)

game.ReplicatedStorage.arrest.ArrestHold.OnServerEvent:Connect(function(Player, Target)
	if Player and Target then
		if Target.Parent then
			local Parent = Target.Parent
			if Parent:FindFirstChildOfClass("Humanoid") then
				local Character = Parent
				Target = game.Players:GetPlayerFromCharacter(Character)
				if Target then
					local PlayerFolder = GetFolder(Player)
					local TargetFolder = GetFolder(Target)
					if PlayerFolder and TargetFolder then
						if not TargetFolder:FindFirstChild("ArrestHolding") then
							if not PlayerFolder:FindFirstChild("ArrestHolding") then
								local ArrestHolding = Instance.new("IntValue")
								ArrestHolding.Value = Target.UserId
								ArrestHolding.Name = "ArrestHolding"
								ArrestHolding.Parent = PlayerFolder
								game.ReplicatedStorage.arrest.GiveArrestUi:FireClient(Player, Target.Name, true)
								local TempFolder = Instance.new("Folder")
								TempFolder.Name = Target.Name .. "'s inventory"
								TempFolder.Parent = game.ServerStorage
								for _, Thing in pairs(Target.Backpack:GetChildren()) do
									Thing.Parent = TempFolder
								end
								spawn(function()
									Character.Torso.Anchored = true
									while wait() do			
										if PlayerFolder:FindFirstChild("ArrestHolding") then
											Character.Torso.CFrame = Player.Character.Torso.CFrame * CFrame.new(0, 0, -5)
										else
											break
										end
									end
								end)
							end
						end
					end
				end
			end
		end
	end
end)

game.ReplicatedStorage.arrest.Release.OnServerEvent:Connect(function(Arrester)
	local ArresterFolder = GetFolder(Arrester)
	if ArresterFolder and ArresterFolder ~= nil then
		if ArresterFolder:FindFirstChild("ArrestHolding") then
			local Player = game.Players:GetPlayerByUserId(ArresterFolder.ArrestHolding.Value)
			if Player then
				ArresterFolder.ArrestHolding:Destroy()
				Player.Character.Torso.Anchored = false
				game.ReplicatedStorage.arrest.GiveArrestUi:FireClient(Arrester, " ", false)
				local TempFolder = game.ServerStorage:FindFirstChild(Player.Name .. "'s inventory")
				if TempFolder then
					for _, Thing in pairs(TempFolder:GetChildren()) do
						Thing.Parent = Player.Backpack
					end
				end
			end
		end
	end
end)

game.Players.PlayerRemoving:Connect(function(Player)
	local PlayerFolder = GetFolder(Player)
	if PlayerFolder:FindFirstChild("ArrestHolding") then
		local Holding = game.Players:GetPlayerByUserId(PlayerFolder.ArrestHolding.Value)
		if Holding then
			PlayerFolder.ArrestHolding:Destroy()
			Holding.Character.Torso.Anchored = false
			local TempFolder = game.ServerStorage:FindFirstChild(Player.Name .. "'s inventory")
			if TempFolder then
				for _, Thing in pairs(TempFolder:GetChildren()) do
					Thing.Parent = Player.Backpack
				end
			end
		end
	end
	for _, Folder in pairs(game.ServerStorage.ArrestFolder:GetChildren()) do
		if Folder:FindFirstChild("ArrestHolding") then
			local OtherPlayer = game.Players:FindFirstChild(Folder.Name)
			if OtherPlayer then
				if Folder.ArrestHolding.Value == Player.UserId then
					game.ReplicatedStorage.arrest.GiveArrestUi:FireClient(OtherPlayer, " ", false)
					Folder.ArrestHolding:Destroy()
					SendHTTP(Player, (Player.Name .. " has left while in ".. OtherPlayer.Name .. "'s cuffs."))
				end
			end
		end
	end
end)

while true do
	wait(1)
	for _, Player in pairs(game.Players:GetPlayers()) do
		local PlayerFolder = GetFolder(Player)
		if PlayerFolder and PlayerFolder ~= nil then
			if PlayerFolder:FindFirstChild("JailTime") then
				if PlayerFolder.JailTime.Value > 0 then
					PlayerFolder.JailTime.Value = PlayerFolder.JailTime.Value - 1
					game.ReplicatedStorage.arrest.UpdateTime:FireClient(Player, tostring(PlayerFolder.JailTime.Value))
					if Player.TeamColor ~= JailColor then
						Player.TeamColor = JailColor
						Player:LoadCharacter()
					end
				else
					if Player.TeamColor == JailColor then
						Player.TeamColor = CivilianColor
						Player:LoadCharacter()
					end
				end
			end
		end
	end
end

Thank you,
Signed, Tbrown392

1 Like