
KeylessUniversal

--========================================================--
-- 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
)No comments yet for this script.



