Universal cilent side grab script
Key RequiredUniversal

Universal cilent side grab script

Universal ScriptEatkidmasterEatkidmaster 391 views 2.9K executesUpdated Sep 7, 2026
Unrated
00
Lua Script•1157 lines (16907 chars)
--========================================================--
-- CLIENT-SIDE GRAB / RELEASE / KILL + RAGDOLL
-- ONE LOCALSCRIPT
-- R6 ONLY
-- MOBILE + PC
--========================================================--

local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local Debris = game:GetService("Debris")

local LocalPlayer = Players.LocalPlayer

--========================================================--
-- SETTINGS
--========================================================--

local MAX_DISTANCE = 12

local HOLD_LEFT = -1
local HOLD_UP = 0.15
local HOLD_FORWARD = 2.5

local POINT_ANIMATION_ID = "128853357"
local POINT_FREEZE_TIME = 0.65

local KILL_SOUND_ID = "91486533705459"

--========================================================--
-- WAIT FOR CHARACTER
--========================================================--

local character = LocalPlayer.Character
	or LocalPlayer.CharacterAdded:Wait()

local humanoid = character:WaitForChild("Humanoid")

--========================================================--
-- R15 CHECK
--========================================================--

if humanoid.RigType == Enum.HumanoidRigType.R15 then

	-- Create only the warning message
	local playerGui =
		LocalPlayer:WaitForChild("PlayerGui")

	local warningGui =
		Instance.new("ScreenGui")

	warningGui.Name =
		"R6OnlyWarning"

	warningGui.ResetOnSpawn = false
	warningGui.IgnoreGuiInset = true
	warningGui.DisplayOrder = 999999

	warningGui.Parent =
		playerGui

	local warning =
		Instance.new("TextLabel")

	warning.Size =
		UDim2.new(
			0.8,
			0,
			0,
			80
		)

	warning.Position =
		UDim2.new(
			0.1,
			0,
			0.5,
			-40
		)

	warning.BackgroundTransparency = 1

	warning.Text =
		"dude you not r6."

	warning.TextScaled = true

	warning.TextColor3 =
		Color3.new(
			1,
			1,
			1
		)

	warning.Font =
		Enum.Font.GothamBold

	warning.Parent =
		warningGui

	task.wait(2)

	warningGui:Destroy()

	--====================================================--
	-- STOP SCRIPT COMPLETELY
	--====================================================--

	return
end

--========================================================--
-- R6 ONLY BELOW THIS POINT
--========================================================--

local holding = false
local targetPlayer = nil
local targetCharacter = nil

local killedPlayers = {}
local ragdolls = {}

local pointTrack = nil

--========================================================--
-- HELPERS
--========================================================--

local function getCharacter()
	return LocalPlayer.Character
end

local function getRoot(char)
	return char and char:FindFirstChild("HumanoidRootPart")
end

local function getHumanoid(char)
	return char and char:FindFirstChildOfClass("Humanoid")
end

--========================================================--
-- FIND NEAREST PLAYER
--========================================================--

local function getNearestPlayer()

	local myCharacter = getCharacter()
	local myRoot = getRoot(myCharacter)

	if not myRoot then
		return nil
	end

	local nearest = nil
	local nearestDistance = MAX_DISTANCE

	for _, player in ipairs(Players:GetPlayers()) do

		if player ~= LocalPlayer
			and not killedPlayers[player] then

			local target = player.Character
			local root = getRoot(target)
			local hum = getHumanoid(target)

			if root
				and hum
				and hum.Health > 0 then

				local distance =
					(myRoot.Position - root.Position).Magnitude

				if distance <= nearestDistance then

					nearestDistance = distance
					nearest = player

				end
			end
		end
	end

	return nearest
end

--========================================================--
-- POINT ANIMATION
--========================================================--

local function playPointAnimation()

	local char = getCharacter()
	local hum = getHumanoid(char)

	if not hum then
		return
	end

	local animator =
		hum:FindFirstChildOfClass("Animator")

	if not animator then

		animator =
			Instance.new("Animator")

		animator.Parent = hum
	end

	local animation =
		Instance.new("Animation")

	animation.AnimationId =
		"rbxassetid://" ..
		POINT_ANIMATION_ID

	local success, track =
		pcall(function()

			return animator:LoadAnimation(animation)

		end)

	if success and track then

		pointTrack = track

		track.Priority =
			Enum.AnimationPriority.Action

		track:Play()

		task.delay(
			POINT_FREEZE_TIME,
			function()

				if track
					and track.IsPlaying then

					track:AdjustSpeed(0)

				end
			end
		)
	end
end

local function stopPointAnimation()

	if pointTrack then

		pcall(function()

			pointTrack:Stop()
			pointTrack:Destroy()

		end)

		pointTrack = nil
	end
end

--========================================================--
-- RELEASE
--========================================================--

local function releaseTarget()

	holding = false

	targetPlayer = nil
	targetCharacter = nil

	stopPointAnimation()
end

--========================================================--
-- GRAB
--========================================================--

local function grabTarget()

	if holding then

		releaseTarget()
		return

	end

	local target =
		getNearestPlayer()

	if not target then
		return
	end

	local myCharacter =
		getCharacter()

	local targetChar =
		target.Character

	local myRoot =
		getRoot(myCharacter)

	local targetRoot =
		getRoot(targetChar)

	if not myRoot
		or not targetRoot then

		return
	end

	holding = true

	targetPlayer =
		target

	targetCharacter =
		targetChar

	targetRoot.CFrame =
		myRoot.CFrame
		* CFrame.new(
			HOLD_LEFT,
			HOLD_UP,
			-HOLD_FORWARD
		)
		* CFrame.Angles(
			0,
			math.rad(180),
			0
		)

	local targetHum =
		getHumanoid(targetChar)

	if targetHum then
		targetHum.AutoRotate = false
	end

	playPointAnimation()
end

--========================================================--
-- HIDE NAME
--========================================================--

local function hideDisplayName(char)

	local hum =
		getHumanoid(char)

	if hum then

		hum.DisplayDistanceType =
			Enum.HumanoidDisplayDistanceType.None

		hum.NameDisplayDistance = 0

	end

	for _, obj in ipairs(char:GetDescendants()) do

		if obj:IsA("BillboardGui") then
			obj.Enabled = false
		end
	end
end

--========================================================--
-- DISABLE REAL VICTIM COLLISION
--========================================================--

local function disableVictimCollision(char)

	for _, obj in ipairs(char:GetDescendants()) do

		if obj:IsA("BasePart") then

			obj.CanCollide = false
			obj.CanTouch = false
			obj.CanQuery = false

		end
	end
end

--========================================================--
-- DETACH ACCESSORY
--========================================================--

local function detachAccessory(accessory)

	if not accessory:IsA("Accessory") then
		return
	end

	local handle =
		accessory:FindFirstChild("Handle")

	if not handle then
		return
	end

	for _, obj in ipairs(accessory:GetDescendants()) do

		if obj:IsA("Weld")
			or obj:IsA("WeldConstraint")
			or obj:IsA("Motor6D") then

			obj:Destroy()

		end
	end

	handle.Anchored = false
	handle.CanCollide = true

	handle.AssemblyLinearVelocity =
		Vector3.new(
			math.random(-3,3),
			math.random(2,6),
			math.random(-3,3)
		)

	handle.AssemblyAngularVelocity =
		Vector3.new(
			math.random(-8,8),
			math.random(-8,8),
			math.random(-8,8)
		)
end

--========================================================--
-- CREATE RAGDOLL
--========================================================--

local function createRagdoll(original)

	if not original then
		return nil
	end

	original.Archivable = true

	local clone

	local success =
		pcall(function()

			clone =
				original:Clone()

		end)

	if not success
		or not clone then

		return nil
	end

	clone.Name =
		original.Name ..
		"_LocalRagdoll"

	clone.Parent =
		workspace

	local originalRoot =
		getRoot(original)

	local cloneRoot =
		getRoot(clone)

	local spawnCFrame

	if originalRoot then

		spawnCFrame =
			originalRoot.CFrame

	elseif cloneRoot then

		spawnCFrame =
			cloneRoot.CFrame

	end

	-- Remove scripts
	for _, obj in ipairs(
		clone:GetDescendants()
	) do

		if obj:IsA("Script")
			or obj:IsA("LocalScript")
			or obj:IsA("ModuleScript")
			or obj:IsA("Animator")
			or obj:IsA("Tool") then

			pcall(function()
				obj:Destroy()
			end)

		end
	end

	-- Accessories fall off
	for _, obj in ipairs(
		clone:GetChildren()
	) do

		if obj:IsA("Accessory") then

			detachAccessory(obj)

		end
	end

	-- Remove humanoid
	local cloneHum =
		getHumanoid(clone)

	if cloneHum then
		cloneHum:Destroy()
	end

	-- Motor6D -> BallSocket
	for _, motor in ipairs(
		clone:GetDescendants()
	) do

		if motor:IsA("Motor6D")
			and motor.Part0
			and motor.Part1 then

			local part0 =
				motor.Part0

			local part1 =
				motor.Part1

			local a0 =
				Instance.new("Attachment")

			a0.CFrame =
				motor.C0

			a0.Parent =
				part0

			local a1 =
				Instance.new("Attachment")

			a1.CFrame =
				motor.C1

			a1.Parent =
				part1

			local socket =
				Instance.new(
					"BallSocketConstraint"
				)

			socket.Attachment0 =
				a0

			socket.Attachment1 =
				a1

			socket.LimitsEnabled = true
			socket.UpperAngle = 70

			socket.TwistLimitsEnabled = true
			socket.TwistLowerAngle = -45
			socket.TwistUpperAngle = 45

			socket.Parent =
				part0

			motor:Destroy()
		end
	end

	-- Remove root
	if cloneRoot then
		cloneRoot:Destroy()
	end

	-- Physical body
	for _, obj in ipairs(
		clone:GetDescendants()
	) do

		if obj:IsA("BasePart") then

			obj.Anchored = false
			obj.CanCollide = true

			if obj.Name == "Handle" then
				obj.CanCollide = true
			end
		end
	end

	-- Lay down
	local torso =
		clone:FindFirstChild("Torso")

	if torso
		and torso:IsA("BasePart") then

		if spawnCFrame then

			torso.CFrame =
				spawnCFrame
				* CFrame.Angles(
					0,
					0,
					math.rad(90)
				)

		end

		torso.AssemblyAngularVelocity =
			Vector3.new(
				0,
				0,
				2.5
			)

		torso.AssemblyLinearVelocity =
			Vector3.new(
				0,
				-3,
				0
			)
	end

	table.insert(
		ragdolls,
		clone
	)

	return clone
end

--========================================================--
-- KILL
--========================================================--

local function fakeKill()

	if not holding then
		return
	end

	local victim =
		targetPlayer

	local victimCharacter =
		targetCharacter

	if not victim
		or not victimCharacter then

		releaseTarget()
		return
	end

	killedPlayers[victim] = true

	holding = false

	-- Hide name
	hideDisplayName(
		victimCharacter
	)

	-- Disable collision on real player
	disableVictimCollision(
		victimCharacter
	)

	-- Make ragdoll
	createRagdoll(
		victimCharacter
	)

	-- Hide real character locally
	for _, obj in ipairs(
		victimCharacter:GetDescendants()
	) do

		if obj:IsA("BasePart") then

			obj.LocalTransparencyModifier = 1
			obj.CanCollide = false
			obj.CanTouch = false
			obj.CanQuery = false

		elseif obj:IsA("Decal") then

			obj.Transparency = 1

		elseif obj:IsA("BillboardGui") then

			obj.Enabled = false
		end
	end

	-- Sound
	local myRoot =
		getRoot(getCharacter())

	if myRoot then

		local sound =
			Instance.new("Sound")

		sound.SoundId =
			"rbxassetid://" ..
			KILL_SOUND_ID

		sound.Volume = 1
		sound.Parent = myRoot

		sound:Play()

		Debris:AddItem(
			sound,
			5
		)
	end

	stopPointAnimation()

	targetPlayer = nil
	targetCharacter = nil
end

--========================================================--
-- UI
--========================================================--

local playerGui =
	LocalPlayer:WaitForChild(
		"PlayerGui"
	)

local oldGui =
	playerGui:FindFirstChild(
		"GrabSystemUI"
	)

if oldGui then
	oldGui:Destroy()
end

local gui =
	Instance.new("ScreenGui")

gui.Name =
	"GrabSystemUI"

gui.ResetOnSpawn = false
gui.IgnoreGuiInset = true
gui.DisplayOrder = 999999

gui.Parent =
	playerGui

--========================================================--
-- STATUS
--========================================================--

local status =
	Instance.new("TextLabel")

status.Size =
	UDim2.new(
		0,
		220,
		0,
		35
	)

status.Position =
	UDim2.new(
		0.5,
		-110,
		0,
		15
	)

status.BackgroundTransparency = 0.25

status.Text =
	"GRAB SYSTEM ACTIVE"

status.TextScaled = true

status.TextColor3 =
	Color3.new(
		1,
		1,
		1
	)

status.BackgroundColor3 =
	Color3.fromRGB(
		25,
		25,
		25
	)

status.Font =
	Enum.Font.GothamBold

status.Parent =
	gui

local statusCorner =
	Instance.new("UICorner")

statusCorner.CornerRadius =
	UDim.new(
		0,
		8
	)

statusCorner.Parent =
	status

--========================================================--
-- BUTTON
--========================================================--

local function createButton(
	name,
	text,
	position
)

	local button =
		Instance.new("TextButton")

	button.Name =
		name

	button.Size =
		UDim2.new(
			0,
			110,
			0,
			55
		)

	button.Position =
		position

	button.BackgroundColor3 =
		Color3.fromRGB(
			35,
			35,
			35
		)

	button.BackgroundTransparency = 0.1

	button.Text =
		text

	button.TextColor3 =
		Color3.new(
			1,
			1,
			1
		)

	button.TextScaled = true

	button.Font =
		Enum.Font.GothamBold

	button.AutoButtonColor = true

	button.Parent =
		gui

	local corner =
		Instance.new("UICorner")

	corner.CornerRadius =
		UDim.new(
			0,
			12
		)

	corner.Parent =
		button

	return button
end

local grabButton =
	createButton(
		"GrabButton",
		"GRAB",
		UDim2.new(
			0,
			15,
			1,
			-75
		)
	)

local releaseButton =
	createButton(
		"ReleaseButton",
		"RELEASE",
		UDim2.new(
		0.5,
		-55,
		1,
		-75
		)
	)

local killButton =
	createButton(
		"KillButton",
		"KILL",
		UDim2.new(
			1,
			-125,
			1,
			-75
		)
	)

--========================================================--
-- BUTTON EVENTS
--========================================================--

grabButton.Activated:Connect(
	function()
		grabTarget()
	end
)

releaseButton.Activated:Connect(
	function()
		releaseTarget()
	end
)

killButton.Activated:Connect(
	function()
		fakeKill()
	end
)

--========================================================--
-- KEYBOARD
--========================================================--

UserInputService.InputBegan:Connect(
	function(input, processed)

		if processed then
			return
		end

		if input.KeyCode ==
			Enum.KeyCode.G then

			grabTarget()

		elseif input.KeyCode ==
			Enum.KeyCode.K then

			fakeKill()

		elseif input.KeyCode ==
			Enum.KeyCode.T then

			releaseTarget()
		end
	end
)

--========================================================--
-- HOLD TARGET
--========================================================--

task.spawn(function()

	while gui.Parent do

		if holding
			and targetPlayer
			and targetCharacter then

			local myRoot =
				getRoot(getCharacter())

			local targetRoot =
				getRoot(targetCharacter)

			if myRoot
				and targetRoot then

				local distance =
					(
						myRoot.Position
						-
						targetRoot.Position
					).Magnitude

				if distance <=
					MAX_DISTANCE + 5 then

					targetRoot.CFrame =
						myRoot.CFrame
						* CFrame.new(
							HOLD_LEFT,
							HOLD_UP,
							-HOLD_FORWARD
						)
						* CFrame.Angles(
							0,
							math.rad(180),
							0
						)

				else

					releaseTarget()

				end

			else

				releaseTarget()

			end
		end

		task.wait()
	end
end)

--========================================================--
-- RESPAWN
--========================================================--

Players.PlayerAdded:Connect(
	function(player)

		player.CharacterAdded:Connect(
			function()

				killedPlayers[player] = nil

			end
		)
	end
)

LocalPlayer.CharacterAdded:Connect(
	function(newCharacter)

		local newHumanoid =
			newCharacter:WaitForChild(
				"Humanoid"
			)

		-- If the player changes to R15,
		-- disable the system again.
		if newHumanoid.RigType ==
			Enum.HumanoidRigType.R15 then

			if gui then
				gui:Destroy()
			end

			local warningGui =
				Instance.new("ScreenGui")

			warningGui.ResetOnSpawn = false
			warningGui.IgnoreGuiInset = true
			warningGui.DisplayOrder = 999999
			warningGui.Parent =
				LocalPlayer.PlayerGui

			local warning =
				Instance.new("TextLabel")

			warning.Size =
				UDim2.new(
					0.8,
					0,
					0,
					80
				)

			warning.Position =
				UDim2.new(
					0.1,
					0,
					0.5,
					-40
				)

			warning.BackgroundTransparency = 1

			warning.Text =
				"dude you not r6."

			warning.TextScaled = true

			warning.TextColor3 =
				Color3.new(
					1,
					1,
					1
				)

			warning.Font =
				Enum.Font.GothamBold

			warning.Parent =
				warningGui

			task.delay(
				2,
				function()

					if warningGui then
						warningGui:Destroy()
					end

				end
			)

			return
		end

		holding = false
		targetPlayer = nil
		targetCharacter = nil

		stopPointAnimation()
	end
)

Features & Information

I'm gonna break your neck
#Universal#Idk#Fun

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts