Pls gamble
Key RequiredUniversal

Pls gamble

Universal Script*rac3*rac3 4.7K views 33 executesUpdated Aug 17, 2025
Unrated
00
Lua Script•571 lines (19844 chars)
-- Gamble GUI
-- Author: You
-- Odds: 50% -10 HP | 10% Reverse Time (10s) | 1% Blink+Noclip | 39% common tools
-- Notes:
-- - Grapple always restores WalkSpeed to 16 and AutoRotate true, even on cancel/death.
-- - On death: GUI is removed, noclip ends, history clears. GUI rebuilds on respawn.
-- - Only gambles if you're alive.

local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local TweenService = game:GetService("TweenService")

local LP = Players.LocalPlayer

-- STATE -----------------------------------------------------------------------
local screen -- ScreenGui (rebuilt on respawn)
local frame, result, gambleBtn
local noclipConn
local posHistory = {}
local SAMPLE = 0.1
local MAX_TIME = 12
local maxSamples = math.floor(MAX_TIME / SAMPLE)

-- UTILS -----------------------------------------------------------------------
local function getChar()
    return LP.Character or LP.CharacterAdded:Wait()
end
local function getHumPair()
    local c = getChar()
    return c:WaitForChild("Humanoid"), c:WaitForChild("HumanoidRootPart")
end

local function bubble(text, color)
    local c = getChar()
    local head = c:FindFirstChild("Head") or c:FindFirstChildWhichIsA("BasePart")
    if not head then return end
    local bb = Instance.new("BillboardGui")
    bb.Name = "GambleBubble"
    bb.Size = UDim2.new(0, 0, 0, 0)
    bb.StudsOffset = Vector3.new(0, 3, 0)
    bb.Adornee = head
    bb.Parent = head

    local tl = Instance.new("TextLabel")
    tl.Size = UDim2.new(0, 220, 0, 36)
    tl.BackgroundTransparency = 0.2
    tl.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
    tl.Text = text
    tl.Font = Enum.Font.GothamBold
    tl.TextSize = 16
    tl.TextColor3 = color or Color3.fromRGB(255,255,255)
    tl.Parent = bb
    Instance.new("UICorner", tl).CornerRadius = UDim.new(0, 8)

    task.delay(1.2, function() if bb then bb:Destroy() end end)
end

local function startNoclip()
    if noclipConn then return end
    noclipConn = RunService.Stepped:Connect(function()
        local c = LP.Character
        if not c then return end
        for _,v in ipairs(c:GetDescendants()) do
            if v:IsA("BasePart") then v.CanCollide = false end
        end
    end)
end
local function stopNoclip()
    if noclipConn then noclipConn:Disconnect(); noclipConn = nil end
end

local function createHandle(color)
    local p = Instance.new("Part")
    p.Name = "Handle"
    p.Size = Vector3.new(1,1,1)
    p.Color = color or Color3.fromRGB(90,90,90)
    p.Anchored = false
    p.CanCollide = false
    p.Massless = true
    return p
end
local function putInBackpack(tool)
    tool.Parent = LP:WaitForChild("Backpack")
end

-- HISTORY SAMPLING ------------------------------------------------------------
local hbConn
local function startSampling()
    if hbConn then hbConn:Disconnect() end
    posHistory = {}
    local acc = 0
    hbConn = RunService.Heartbeat:Connect(function(dt)
        acc += dt
        if acc >= SAMPLE then
            acc -= SAMPLE
            local hum, hrp = getHumPair()
            if hum and hum.Health > 0 and hrp then
                table.insert(posHistory, hrp.CFrame)
                if #posHistory > maxSamples then table.remove(posHistory, 1) end
            end
        end
    end)
end

-- TOOLS -----------------------------------------------------------------------
-- Safe Teleport
local function makeSafeTeleportTool()
    local tool = Instance.new("Tool")
    tool.Name = "Safe Teleport"
    tool.RequiresHandle = true
    createHandle(Color3.fromRGB(80, 200, 255)).Parent = tool

    tool.Activated:Connect(function()
        local hum, hrp = getHumPair()
        if not hum or hum.Health <= 0 then return end

        local best, bestDist
        for _, d in ipairs(workspace:GetDescendants()) do
            if d:IsA("SpawnLocation") then
                local dist = (hrp.Position - d.Position).Magnitude
                if not best or dist < bestDist then best, bestDist = d, dist end
            end
        end
        local target = best and (best.Position + Vector3.new(0, 5, 0)) or (hrp.Position + Vector3.new(0, 50, 0))
        hrp.CFrame = CFrame.new(target)
        bubble("Teleported to safety!", Color3.fromRGB(120,220,255))
        tool:Destroy()
    end)

    return tool
end

-- Speed Potion
local function makeSpeedPotion(multiplier, durationSec, label)
    local tool = Instance.new("Tool")
    tool.Name = label or ("Speed Potion x"..tostring(multiplier))
    tool.RequiresHandle = true
    createHandle(Color3.fromRGB(255, 80, 120)).Parent = tool

    tool.Activated:Connect(function()
        local hum = select(1, getHumPair())
        if not hum or hum.Health <= 0 then return end
        if tool:GetAttribute("Active") then return end
        tool:SetAttribute("Active", true)

        local baseWalk = hum.WalkSpeed
        hum.WalkSpeed = math.max(2, baseWalk * multiplier)
        bubble(tool.Name.." ON ("..durationSec.."s)", Color3.fromRGB(255,120,160))
        task.delay(durationSec, function()
            if hum and hum.Parent then
                hum.WalkSpeed = baseWalk
                bubble("Speed reverted", Color3.fromRGB(200,200,200))
            end
            if tool and tool.Parent then tool:Destroy() end
        end)
    end)

    return tool
end

-- Jump Potion
local function makeJumpPotion(multiplier, durationSec, label)
    local tool = Instance.new("Tool")
    tool.Name = label or ("Jump Potion x"..tostring(multiplier))
    tool.RequiresHandle = true
    createHandle(Color3.fromRGB(120, 180, 255)).Parent = tool

    tool.Activated:Connect(function()
        local hum = select(1, getHumPair())
        if not hum or hum.Health <= 0 then return end
        if tool:GetAttribute("Active") then return end
        tool:SetAttribute("Active", true)

        local usingPower = hum.UseJumpPower
        local basePower, baseHeight
        if usingPower then
            basePower = hum.JumpPower
            hum.JumpPower = math.max(10, basePower * multiplier)
        else
            baseHeight = hum.JumpHeight
            hum.JumpHeight = math.max(2, baseHeight * multiplier)
        end

        bubble(tool.Name.." ON ("..durationSec.."s)", Color3.fromRGB(140,200,255))
        task.delay(durationSec, function()
            if hum and hum.Parent then
                if usingPower then hum.JumpPower = basePower else hum.JumpHeight = baseHeight end
                bubble("Jump reverted", Color3.fromRGB(200,200,200))
            end
            if tool and tool.Parent then tool:Destroy() end
        end)
    end)

    return tool
end

-- Rope Grapple (fixed)
local function makeRopeGrapple()
    local tool = Instance.new("Tool")
    tool.Name = "Rope Grapple"
    tool.RequiresHandle = true
    createHandle(Color3.fromRGB(220,220,220)).Parent = tool

    local actConn, uneqConn, diedConn
    local grappleBusy = false

    local function cleanupGrapple(hum, hrp, beam, attachStart, anchor)
        if beam then pcall(function() beam:Destroy() end) end
        if attachStart then pcall(function() attachStart:Destroy() end) end
        if anchor then pcall(function() anchor:Destroy() end) end
        if hum and hum.Parent then
            hum.WalkSpeed = 16
            hum.AutoRotate = true
        end
        grappleBusy = false
    end

    tool.Equipped:Connect(function(mouse)
        mouse = mouse or LP:GetMouse()

        -- Avoid stacking Activated connections across equips
        if actConn then actConn:Disconnect() end
        actConn = tool.Activated:Connect(function()
            if grappleBusy then return end
            grappleBusy = true

            local hum, hrp = getHumPair()
            if not hum or hum.Health <= 0 then cleanupGrapple(hum, hrp); return end
            local hitCF = mouse and mouse.Hit
            if not hitCF then bubble("No target", Color3.fromRGB(255,150,150)); cleanupGrapple(hum, hrp); return end
            local targetPos = hitCF.Position

            -- Visual rope setup
            local attachStart = Instance.new("Attachment"); attachStart.Name = "GrappleStart"; attachStart.Parent = hrp
            local anchor = Instance.new("Part")
            anchor.Name = "GrapplePoint"
            anchor.Size = Vector3.new(0.2,0.2,0.2)
            anchor.Anchored = true; anchor.CanCollide = false; anchor.Transparency = 1
            anchor.Position = targetPos; anchor.Parent = workspace
            local attachEnd = Instance.new("Attachment"); attachEnd.Name = "GrappleEnd"; attachEnd.Parent = anchor

            local beam = Instance.new("Beam")
            beam.Color = ColorSequence.new(Color3.fromRGB(200,200,200))
            beam.Width0, beam.Width1 = 0.05, 0.05
            beam.Attachment0, beam.Attachment1 = attachStart, attachEnd
            beam.LightEmission = 0.7
            beam.Transparency = NumberSequence.new(0.1)
            beam.Parent = hrp

            -- Movement
            local speed = 60
            local start = hrp.Position
            local dist = (targetPos - start).Magnitude
            local dur = math.clamp(dist / speed, 0.2, 3.5)
            local endCF = CFrame.new(targetPos + Vector3.new(0, 3, 0), targetPos)

            local oldRotate = hum.AutoRotate
            hum.AutoRotate = false
            hum.WalkSpeed = 0

            local tween = TweenService:Create(hrp, TweenInfo.new(dur, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {CFrame = endCF})
            tween:Play()

            -- Cancel hooks (death or unequip)
            local canceled = false
            if diedConn then diedConn:Disconnect() end
            local humanoid = hum
            diedConn = humanoid.Died:Connect(function()
                canceled = true
                pcall(function() tween:Cancel() end)
            end)
            if uneqConn then uneqConn:Disconnect() end
            uneqConn = tool.Unequipped:Connect(function()
                canceled = true
                pcall(function() tween:Cancel() end)
            end)

            -- Wait for tween or cancel
            local completed = false
            tween.Completed:Connect(function() completed = true end)
            local t0 = os.clock()
            while not completed and not canceled and os.clock() - t0 < dur + 0.5 do
                RunService.Heartbeat:Wait()
            end

            -- Cleanup (always restore to safe defaults)
            cleanupGrapple(hum, hrp, beam, attachStart, anchor)
            bubble("Grapple!", Color3.fromRGB(230,230,230))
        end)
    end)

    tool.Destroying:Connect(function()
        if actConn then actConn:Disconnect() end
        if uneqConn then uneqConn:Disconnect() end
        if diedConn then diedConn:Disconnect() end
    end)

    return tool
end

-- Blink + Noclip (1%)
local function makeBlinkNoclip()
    local tool = Instance.new("Tool")
    tool.Name = "Blink + Noclip (1%)"
    tool.RequiresHandle = true
    createHandle(Color3.fromRGB(255, 230, 100)).Parent = tool

    local cachedMouse
    tool.Equipped:Connect(function(mouse) cachedMouse = mouse or LP:GetMouse() end)

    tool.Activated:Connect(function()
        local hum, hrp = getHumPair()
        if not hum or hum.Health <= 0 then return end
        local mouse = cachedMouse or LP:GetMouse()
        local hitCF = mouse and mouse.Hit
        if not hitCF then bubble("No target", Color3.fromRGB(255,150,150)); return end

        hrp.CFrame = CFrame.new(hitCF.Position + Vector3.new(0, 3, 0))
        bubble("Blink!", Color3.fromRGB(255,230,120))

        startNoclip()
        bubble("Noclip 8s", Color3.fromRGB(255,230,120))
        task.delay(8, function()
            stopNoclip()
            bubble("Noclip ended", Color3.fromRGB(200,200,200))
            if tool and tool.Parent then tool:Destroy() end
        end)
    end)

    return tool
end

-- Reverse Time (10s, 10%)
local function makeReverseTool()
    local tool = Instance.new("Tool")
    tool.Name = "Reverse Time (10s)"
    tool.RequiresHandle = true
    createHandle(Color3.fromRGB(120, 255, 200)).Parent = tool

    tool.Activated:Connect(function()
        if tool:GetAttribute("Used") then return end
        tool:SetAttribute("Used", true)

        local hum, hrp = getHumPair()
        if not hum or hum.Health <= 0 then return end

        local need = math.floor(10 / SAMPLE)
        local snaps = {}
        for i = #posHistory, math.max(1, #posHistory - need + 1), -1 do
            table.insert(snaps, posHistory[i])
        end
        if #snaps < 3 then bubble("Not enough history", Color3.fromRGB(255,150,150)); tool:Destroy(); return end

        local oldWalk, oldRot = hum.WalkSpeed, hum.AutoRotate
        hum.WalkSpeed = 0; hum.AutoRotate = false
        startNoclip()
        bubble("Rewinding 10s...", Color3.fromRGB(120,255,200))

        for i = 1, #snaps do
            if not hum or hum.Health <= 0 then break end
            hrp.CFrame = snaps[i]
            task.wait(SAMPLE)
        end

        stopNoclip()
        if hum and hum.Parent then
            hum.AutoRotate = true
            hum.WalkSpeed = oldWalk
        end
        bubble("Back to then.", Color3.fromRGB(200,200,200))
        tool:Destroy()
    end)

    return tool
end

-- COMMON REWARD POOL ----------------------------------------------------------
local function giveCommonReward()
    local rewards = {
        function() return makeSafeTeleportTool() end,
        function() return makeSpeedPotion(2, 15, "Speed Potion 1 (x2, 15s)") end,
        function() return makeSpeedPotion(3, 15, "Speed Potion 2 (x3, 15s)") end,
        function() return makeJumpPotion(1.5, 15, "Jump Potion 1 (x1.5, 15s)") end,
        function() return makeJumpPotion(2, 15, "Jump Potion 2 (x2, 15s)") end,
        function() return makeRopeGrapple() end,
    }
    local pick = rewards[math.random(1, #rewards)]()
    putInBackpack(pick)
    return pick.Name
end

-- GUI BUILD / RESET -----------------------------------------------------------
local function destroyGui()
    if screen then pcall(function() screen:Destroy() end) screen = nil end
    frame, result, gambleBtn = nil, nil, nil
end

local function buildGui()
    destroyGui()
    local PG = LP:WaitForChild("PlayerGui")

    screen = Instance.new("ScreenGui")
    screen.Name = "GambleUI"
    screen.ResetOnSpawn = false -- we manually reset on death for instant cleanup
    screen.IgnoreGuiInset = false
    screen.Parent = PG

    frame = Instance.new("Frame")
    frame.Name = "Panel"
    frame.Size = UDim2.new(0, 280, 0, 170)
    frame.Position = UDim2.new(0, 20, 0, 80)
    frame.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
    frame.BorderSizePixel = 0
    frame.Active = true
    frame.Draggable = true
    frame.Parent = screen
    local uiCorner = Instance.new("UICorner", frame); uiCorner.CornerRadius = UDim.new(0, 10)
    local uiStroke = Instance.new("UIStroke", frame); uiStroke.Thickness = 2; uiStroke.Color = Color3.fromRGB(255, 70, 70)

    local title = Instance.new("TextLabel")
    title.BackgroundTransparency = 1
    title.Size = UDim2.new(1, -10, 0, 34)
    title.Position = UDim2.new(0, 10, 0, 8)
    title.Text = "Gamble"
    title.Font = Enum.Font.GothamBold
    title.TextSize = 20
    title.TextColor3 = Color3.fromRGB(255,255,255)
    title.TextXAlignment = Enum.TextXAlignment.Left
    title.Parent = frame

    result = Instance.new("TextLabel")
    result.BackgroundTransparency = 1
    result.Size = UDim2.new(1, -20, 0, 40)
    result.Position = UDim2.new(0, 10, 0, 46)
    result.Text = "Tap GAMBLE. Alive-only. Death resets UI."
    result.Font = Enum.Font.Gotham
    result.TextSize = 16
    result.TextColor3 = Color3.fromRGB(220,220,220)
    result.TextWrapped = true
    result.Parent = frame

    gambleBtn = Instance.new("TextButton")
    gambleBtn.Size = UDim2.new(1, -20, 0, 56)
    gambleBtn.Position = UDim2.new(0, 10, 1, -66)
    gambleBtn.BackgroundColor3 = Color3.fromRGB(255, 70, 70)
    gambleBtn.Text = "GAMBLE"
    gambleBtn.Font = Enum.Font.GothamBlack
    gambleBtn.TextSize = 22
    gambleBtn.TextColor3 = Color3.fromRGB(255,255,255)
    gambleBtn.AutoButtonColor = true
    gambleBtn.Parent = frame
    Instance.new("UICorner", gambleBtn).CornerRadius = UDim.new(0, 10)
end

local function setBtnState(enabled)
    if not gambleBtn then return end
    gambleBtn.AutoButtonColor = enabled
    gambleBtn.BackgroundColor3 = enabled and Color3.fromRGB(255, 70, 70) or Color3.fromRGB(120, 120, 120)
    gambleBtn.Active = enabled
end

-- GAMBLE LOGIC ----------------------------------------------------------------
local cooldown = false
local function doRoll()
    if cooldown then return end
    local hum = select(1, getHumPair())
    if not hum or hum.Health <= 0 then
        if result then
            result.Text = "You must be alive to gamble."
            result.TextColor3 = Color3.fromRGB(255,150,150)
        end
        return
    end

    cooldown = true
    setBtnState(false)
    if result then
        result.Text = "Rolling..."
        result.TextColor3 = Color3.fromRGB(240,240,240)
    end

    task.wait(0.35)

    local roll = math.random(1, 100)
    if roll <= 50 then
        hum:TakeDamage(10)
        if result then
            result.Text = "-10 HP (Ouch!)"
            result.TextColor3 = Color3.fromRGB(255,120,120)
        end
        bubble("-10 HP", Color3.fromRGB(255,90,90))

    elseif roll <= 60 then
        local t = makeReverseTool()
        putInBackpack(t)
        if result then
            result.Text = "You won: Reverse Time (10s)"
            result.TextColor3 = Color3.fromRGB(120,255,200)
        end
        bubble("Won: Reverse Time", Color3.fromRGB(120,255,200))

    elseif roll <= 61 then
        local t = makeBlinkNoclip()
        putInBackpack(t)
        if result then
            result.Text = "You won: Blink + Noclip (1%)"
            result.TextColor3 = Color3.fromRGB(255,230,120)
        end
        bubble("Legendary: Blink + Noclip!", Color3.fromRGB(255,230,120))

    else
        local name = giveCommonReward()
        if result then
            result.Text = "You won: "..name
            result.TextColor3 = Color3.fromRGB(120,255,160)
        end
        bubble("Won: "..name, Color3.fromRGB(120,255,160))
    end

    task.delay(0.6, function()
        cooldown = false
        setBtnState(true)
    end)
end

-- WIRING ----------------------------------------------------------------------
local clickConn, nudgeConn
local function hookButton()
    if not gambleBtn then return end
    if clickConn then clickConn:Disconnect() end
    clickConn = gambleBtn.MouseButton1Click:Connect(doRoll)

    if nudgeConn then nudgeConn:Disconnect() end
    nudgeConn = gambleBtn.MouseButton1Down:Connect(function()
        local p0 = gambleBtn.Position
        TweenService:Create(gambleBtn, TweenInfo.new(0.05), {Position = p0 + UDim2.new(0, 2, 0, 0)}):Play()
        task.wait(0.05)
        TweenService:Create(gambleBtn, TweenInfo.new(0.05), {Position = p0}):Play()
    end)
end

local diedConn, addedConn
local function onCharacter(char)
    -- Ensure defaults on spawn
    task.defer(function()
        local hum = char:WaitForChild("Humanoid")
        hum.WalkSpeed = 16
        hum.AutoRotate = true
    end)

    -- Start history sampling fresh
    startSampling()

    -- Rebuild GUI and hook
    buildGui()
    hookButton()

    -- Death handling: hard reset
    if diedConn then diedConn:Disconnect() end
    local hum = char:WaitForChild("Humanoid")
    diedConn = hum.Died:Connect(function()
        stopNoclip()
        posHistory = {}
        destroyGui() -- remove immediately on death
    end)
end

-- INIT ------------------------------------------------------------------------
if addedConn then addedConn:Disconnect() end
addedConn = LP.CharacterAdded:Connect(onCharacter)
if LP.Character then onCharacter(LP.Character) end

Features & Information

Testing.

Community Comments (3)

*rac3*rac3Aug 17, 2025

Pls gamble

zxcvzxcvAug 17, 2025

I'm author

Replying to @zxcv
*rac3*rac3Aug 17, 2025

@zxcv yes you are

More Scripts for Universal Scripts