--========================================================-- -- 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 )