Grab tools (credit on YouTube is mastersmz)
Key RequiredUniversal

Grab tools (credit on YouTube is mastersmz)

Universal ScriptElliot1951Elliot1951 8.3K views 192 executesUpdated May 1, 2025
5.0/ 5(3 votes)
30100% Positive
Lua Script•208 lines (6474 chars)
local player = game.Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")

-- Throw settings (default values)
local throwForce = 50
local throwUpForce = 10

-- GUI variables
local gui = nil
local frame = nil

-- Tool logic
local grabTool = Instance.new("Tool")
grabTool.Name = "Grab"
grabTool.RequiresHandle = false

local handle = Instance.new("Part")
handle.Name = "Handle"
handle.Size = Vector3.new(0.5, 0.5, 0.5)
handle.Transparency = 1
handle.CanCollide = false
handle.Parent = grabTool

-- GUI creation function
local function createGUI()
    if gui then gui:Destroy() end
    
    gui = Instance.new("ScreenGui")
    gui.Name = "GrabToolGUI"
    gui.ResetOnSpawn = false
    gui.Parent = player.PlayerGui

    frame = Instance.new("Frame")
    frame.Size = UDim2.new(0, 200, 0, 120)
    frame.Position = UDim2.new(0, 10, 1, -130) -- Bottom left corner with padding
    frame.AnchorPoint = Vector2.new(0, 1)
    frame.BackgroundTransparency = 0.7
    frame.BackgroundColor3 = Color3.fromRGB(40, 40, 40)
    frame.Parent = gui

    local title = Instance.new("TextLabel")
    title.Text = "Throw Settings"
    title.Size = UDim2.new(1, 0, 0, 30)
    title.BackgroundTransparency = 1
    title.TextColor3 = Color3.fromRGB(255, 255, 255)
    title.Parent = frame

    -- Horizontal force slider
    local forceLabel = Instance.new("TextLabel")
    forceLabel.Text = "Throw Force: "..throwForce
    forceLabel.Size = UDim2.new(1, 0, 0, 20)
    forceLabel.Position = UDim2.new(0, 0, 0, 30)
    forceLabel.BackgroundTransparency = 1
    forceLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
    forceLabel.Parent = frame

    local forceSlider = Instance.new("TextBox")
    forceSlider.Size = UDim2.new(0.9, 0, 0, 20)
    forceSlider.Position = UDim2.new(0.05, 0, 0, 50)
    forceSlider.Text = tostring(throwForce)
    forceSlider.BackgroundColor3 = Color3.fromRGB(80, 80, 80)
    forceSlider.TextColor3 = Color3.fromRGB(255, 255, 255)
    forceSlider.Parent = frame

    -- Vertical force slider
    local upForceLabel = Instance.new("TextLabel")
    upForceLabel.Text = "Upward Force: "..throwUpForce
    upForceLabel.Size = UDim2.new(1, 0, 0, 20)
    upForceLabel.Position = UDim2.new(0, 0, 0, 70)
    upForceLabel.BackgroundTransparency = 1
    upForceLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
    upForceLabel.Parent = frame

    local upForceSlider = Instance.new("TextBox")
    upForceSlider.Size = UDim2.new(0.9, 0, 0, 20)
    upForceSlider.Position = UDim2.new(0.05, 0, 0, 90)
    upForceSlider.Text = tostring(throwUpForce)
    upForceSlider.BackgroundColor3 = Color3.fromRGB(80, 80, 80)
    upForceSlider.TextColor3 = Color3.fromRGB(255, 255, 255)
    upForceSlider.Parent = frame

    -- Value change handlers
    forceSlider.FocusLost:Connect(function(enterPressed)
        local newValue = tonumber(forceSlider.Text)
        if newValue and newValue >= 0 and newValue <= 500 then
            throwForce = newValue
            forceLabel.Text = "Throw Force: "..throwForce
        else
            forceSlider.Text = tostring(throwForce)
        end
    end)

    upForceSlider.FocusLost:Connect(function(enterPressed)
        local newValue = tonumber(upForceSlider.Text)
        if newValue and newValue >= 0 and newValue <= 100 then
            throwUpForce = newValue
            upForceLabel.Text = "Upward Force: "..throwUpForce
        else
            upForceSlider.Text = tostring(throwUpForce)
        end
    end)
end

-- Tool equip/unequip handlers
grabTool.Equipped:Connect(function()
    createGUI()
end)

grabTool.Unequipped:Connect(function()
    if gui then
        gui:Destroy()
        gui = nil
    end
end)

-- Add tool to inventory
grabTool.Parent = player.Backpack

-- Rest of the tool logic remains the same
local mouse = player:GetMouse()
local heldModel = nil
local originalCollisions = {}
local bodyVelocity = nil

local function disableModelCollisions(model)
    originalCollisions = {}
    for _, part in ipairs(model:GetDescendants()) do
        if part:IsA("BasePart") then
            originalCollisions[part] = part.CanCollide
            part.CanCollide = false
        end
    end
end

local function restoreModelCollisions()
    for part, canCollide in pairs(originalCollisions) do
        if part and part.Parent then
            part.CanCollide = canCollide
        end
    end
    originalCollisions = {}
end

local function pullItem(target)
    if heldModel then return end
    
    heldModel = target:FindFirstAncestorOfClass("Model") or target
    disableModelCollisions(heldModel)
    
    local primaryPart = heldModel.PrimaryPart or heldModel:FindFirstChildWhichIsA("BasePart")
    if not primaryPart then return end
    
    bodyVelocity = Instance.new("BodyVelocity")
    bodyVelocity.Velocity = Vector3.new(0, 0, 0)
    bodyVelocity.MaxForce = Vector3.new(math.huge, math.huge, math.huge)
    bodyVelocity.Parent = primaryPart
    
    game:GetService("RunService").Heartbeat:Connect(function()
        if not heldModel or not bodyVelocity then return end
        
        local handlePos = grabTool.Handle.Position
        local partPos = primaryPart.Position
        local direction = (handlePos - partPos).Unit * 50
        
        bodyVelocity.Velocity = direction
    end)
end

local function throwItem()
    if not heldModel then return end
    
    local primaryPart = heldModel.PrimaryPart or heldModel:FindFirstChildWhichIsA("BasePart")
    if not primaryPart then return end
    
    restoreModelCollisions()
    
    if bodyVelocity then
        bodyVelocity:Destroy()
        bodyVelocity = nil
    end
    
    local camera = workspace.CurrentCamera
    local throwDirection = (mouse.Hit.Position - camera.CFrame.Position).Unit
    
    local throwVelocity = Instance.new("BodyVelocity")
    throwVelocity.Velocity = throwDirection * throwForce + Vector3.new(0, throwUpForce, 0)
    throwVelocity.MaxForce = Vector3.new(math.huge, math.huge, math.huge)
    throwVelocity.Parent = primaryPart
    
    game:GetService("Debris"):AddItem(throwVelocity, 0.5)
    
    heldModel = nil
end

grabTool.Activated:Connect(function()
    if not grabTool.Parent:IsA("Model") then return end
    
    if heldModel then
        throwItem()
        return
    end
    
    local target = mouse.Target
    if target and not target.Anchored and not target:IsDescendantOf(character) then
        pullItem(target)
    end
end)

Features & Information

If grab tools doesn't work it's only work for a unanchored part

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts