CollarHandler (serverscript):
local events = game.ReplicatedStorage:WaitForChild("RemoteEvents")

local function GiveCollarGetAttachment(player)
	local char = player.Character

	local g = script.Collar:clone()
	g.Parent = char
	local C = g:GetChildren()
	for i=1, #C do
		if C[i]:IsA("BasePart") then
			local W = Instance.new("Weld")
			W.Part0 = g.Middle
			W.Part1 = C[i]
			local CJ = CFrame.new(g.Middle.Position)
			local C0 = g.Middle.CFrame:inverse() * CJ
			local C1 = C[i].CFrame:inverse() * CJ
			W.C0 = C0
			W.C1 = C1
			W.Parent = g.Middle
		end
		local Y = Instance.new("Weld")
		Y.Part0 = char.Head
		Y.Part1 = g.Middle
		Y.C0 = CFrame.new(0, 0, 0)
		Y.Parent = Y.Part0
	end

	local h = g:GetChildren()
	for i = 1, #h do
		if h[i]:IsA("BasePart") then
			h[i].Anchored = false
			h[i].CanCollide = false
		end
	end

	return g.AttachmentPart.Attachment
end

local function AddAttachmentToArm(player)
	local char = player.Character
	local newAttachment = Instance.new("Attachment")
	newAttachment.Position = Vector3.new(0, -1, 0)
	newAttachment.Parent = char["Right Arm"]

	return newAttachment
end

local function MakeLeash(Attachment0, Attachment1)
	local newRopeRenderer = script.RopeRenderer:Clone()
	newRopeRenderer.DrawLocalLine.Attachment0.Value = Attachment0
	newRopeRenderer.DrawLocalLine.Attachment1.Value = Attachment1
	newRopeRenderer.Parent = workspace
	newRopeRenderer.Enabled = true

	return newRopeRenderer
end

local function AddPlayerController(victim, owner)
	local newPlayerController = script.PlayerController:Clone()
	newPlayerController.Owner.Value = owner.Character
	newPlayerController.Parent = victim.PlayerGui
	newPlayerController.Enabled = true
end

local function AddCollarRemover(victim, owner)
	local newRemover = script.CollarRemover:Clone()
	newRemover.Victim.Value = victim
	newRemover.Owner.Value = owner
	newRemover.Parent = workspace
	newRemover.Enabled = true
end

local function MakeCollar(owner, victim)
	local attachment0 = GiveCollarGetAttachment(victim)
	local attachment1 = AddAttachmentToArm(owner)
	local newRope = MakeLeash(attachment0, attachment1)

	AddPlayerController(victim, owner)
	AddCollarRemover(victim, owner)
end

events.SendCollarRequest.OnServerEvent:Connect(function(player, target)
	events.ActivateLocalCollarUI:FireClient(target, player.Name)
end)

events.CollarPlayer.OnServerEvent:Connect(function(victim, owner)
	MakeCollar(owner, victim)
	events.CreateCollarObjectEvent:FireClient(victim, owner.Name)
	events.CreateCollarObjectEvent:FireClient(owner, victim.Name)
end)

CollarRemover(parented to CollarHandler):
local victim = script.Victim.Value
local owner = script.Owner.Value

function RemoveCollar()
	print("Removing collar")
	game.ReplicatedStorage.RemoteEvents.RemoveCollar:FireAllClients()
	if victim.Character then
		victim.Character.Collar:Destroy()
	end
	script:Destroy()
	game.ReplicatedStorage.RemoteEvents.DestroyCollarObjectEvent:FireClient(victim, owner.Name)
	game.ReplicatedStorage.RemoteEvents.DestroyCollarObjectEvent:FireClient(owner, victim.Name)
end

victim.Character.Humanoid.Died:Connect(RemoveCollar)
owner.Character.Humanoid.Died:Connect(RemoveCollar)

victim.CharacterRemoving:Connect(RemoveCollar)
owner.CharacterRemoving:Connect(RemoveCollar)

game.ReplicatedStorage.RemoteEvents.RemoveCollar.OnServerEvent:Connect(function(player)
	if player == victim or player == owner then
		RemoveCollar()
	end
end)

localscript to manage the UI:
local Player = game.Players.LocalPlayer
local pgui = Player.PlayerGui

local mouse = Player:GetMouse()
local target = nil

local UI = script.Parent
local Main = UI.Frame
local intmenu = Main.OptionStuff
local cam = workspace.CurrentCamera

function HideUI()
	Main.TitleLabel.Text = ""
	Main.Visible = false
end

function button1Down()
	if not mouse.Target then
		target = nil
		HideUI()
	else
		if mouse.Target.Parent:FindFirstChild("Humanoid")
			and mouse.Target.Parent:FindFirstChild("HumanoidRootPart") then
			
			
			if game.Players:FindFirstChild(mouse.Target.Parent.Name) then
				target = mouse.Target.Parent:FindFirstChild("HumanoidRootPart")
				Main.TitleLabel.Text = mouse.Target.Parent.Name.." Sync Menu:"
				intmenu.PlayerName.Value = mouse.Target.Parent.Name
			else
				target = nil
				HideUI()
			end
		else
			target = nil
			HideUI()
		end
	end	
end

mouse.Button1Down:Connect(button1Down)

function findPlayer(b)
	for a, c in game.Players:GetPlayers() do
		local a = string.find(c.Name:lower(), b:lower())
		if a and a == 1 then
			return c
		end
	end
	return false
end

intmenu.Button1.MouseButton1Click:Connect(function()
	local a = findPlayer(intmenu.PlayerName.Value)
	if a and a ~= game.Players.LocalPlayer then
		if pgui:FindFirstChild("Syncs") then
			if pgui.Syncs:FindFirstChild(a.Name) then
				game.ReplicatedStorage.RemoteEvents.RemoveSync:FireServer(a)
			else
				game.ReplicatedStorage.RemoteEvents.SendSyncRequest:FireServer(a)
			end
		end 

	else

	end
end)
intmenu.Button2.MouseButton1Click:Connect(function()
	local a = findPlayer(intmenu.PlayerName.Value)
	if a and a ~= game.Players.LocalPlayer then
		if pgui:FindFirstChild("Collars") then
			if pgui.Collars:FindFirstChild(a.Name) then
				game.ReplicatedStorage.RemoteEvents.RemoveCollar:FireServer(a)
			else
				game.ReplicatedStorage.RemoteEvents.SendCollarRequest:FireServer(a)
			end
		end 

	else

	end
end)


game["Run Service"].Heartbeat:Connect(function()
	if target ~= nil then
		local vector, onScreen = cam:WorldToScreenPoint(target.Position)
		local screenPoint = Vector2.new(vector.X, vector.Y)
		local depth = vector.Z
		intmenu.Button1.Text = "Request Sync"
		intmenu.Button1.TextColor3 = Color3.fromRGB(162, 255, 162)

		if pgui:FindFirstChild("Syncs") then
			if pgui.Syncs:FindFirstChild(intmenu.PlayerName.Value) then
				intmenu.Button1.Text = "Un-Sync"
				intmenu.Button1.TextColor3 = Color3.fromRGB(255, 162, 162)
			end
		end
		


		if pgui:FindFirstChild("Collars") then
			if pgui.Collars:FindFirstChild(intmenu.PlayerName.Value) then
				intmenu.Button2.Text = "Remove Collar"
				intmenu.Button2.TextColor3 = Color3.fromRGB(255, 162, 162)
			else
				intmenu.Button2.Text = "Request Collar"
				intmenu.Button2.TextColor3 = Color3.fromRGB(255, 255, 255)
			end
		end

		Main.Position = UDim2.new(0, screenPoint.X, 0, screenPoint.Y)
		Main.Visible = onScreen
	else
		HideUI()
	end
end)



game.ReplicatedStorage:WaitForChild("RemoteEvents"):WaitForChild("ActivateLocalSyncUI").OnClientEvent:Connect(function(a)
	local newsync = script.Parent.SyncNotif:Clone()

	newsync.PlayerName.Value = a
	newsync.TextLabel.Text = a.." would like to sync."
	newsync.Visible = true
	newsync.Parent = UI.Frame1
end)


if a player is collared or is collaring and tries to remove their collar then ALL THE CURRENT PLAYERS are getting uncollared.