Auto Complete
Key Required

Auto Complete

Obby Royalevikuviku 4K views 644 executesUpdated Oct 22, 2025
0.0/ 5(3 votes)
030% Positive
Lua Script•518 lines (14505 chars)
--[[
Made by Null | @guardi.an
]]--

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

local plr = Players.LocalPlayer
local char = plr.Character or plr.CharacterAdded:Wait()
local root = char:WaitForChild("HumanoidRootPart")
local hum = char:WaitForChild("Humanoid")

local spawns = {}
local spawnFolder = workspace.Arena.Spawns
for i = 1, 8 do
    local spawn = spawnFolder:FindFirstChild(tostring(i))
    if spawn then
        local top = spawn:FindFirstChild("Top")
        if top and top:IsA("BasePart") then
            table.insert(spawns, top)
        end
    end
end

local targets = {}
for _, part in ipairs(workspace.Middle.CollideableTop:GetChildren()) do
    if part:IsA("BasePart") and part.Name == "Collideable" then
        table.insert(targets, part)
    end
end

if #targets == 0 then
    return
end

local function removeKills()
    for _, obj in ipairs(workspace:GetDescendants()) do
        if obj:IsA("BasePart") and (string.find(string.lower(obj.Name), "kill") or string.find(string.lower(obj.Name), "damage") or obj.Material == Enum.Material.Neon) then
            obj.CFrame = CFrame.new(0, -1000, 0)
        end
    end
end

removeKills()

workspace.DescendantAdded:Connect(function(obj)
    if obj:IsA("BasePart") and (string.find(string.lower(obj.Name), "kill") or string.find(string.lower(obj.Name), "damage") or obj.Material == Enum.Material.Neon) then
        obj.CFrame = CFrame.new(0, -1000, 0)
    end
end)

local enabled = true
local waitTime = 10.3
local baseSpd = 55
local spdMin = 40
local spdMax = 50
local heightOff = 3
local spawnRad = 15
local targetProx = 8
local tweenCt = 0
local anchorDist = 2.5

local freezeRad = 15
local unfreezeRad = 30
local freezeTime = 1.25
local frozen = false
local freezeConn
local tweening = false

local function getPlayersInRadius(pos, rad)
    local players = {}
    for _, p in ipairs(Players:GetPlayers()) do
        if p ~= plr and p.Character then
            local r = p.Character:FindFirstChild("HumanoidRootPart")
            if r then
                local dist = (r.Position - pos).Magnitude
                if dist <= rad then
                    table.insert(players, p)
                end
            end
        end
    end
    return players
end

local function freeze()
    if frozen or not tweening then return end
    frozen = true
    
    root.Anchored = true
    
    local start = tick()
    freezeConn = RunService.Heartbeat:Connect(function()
        local tgt = targets[1]
        local nearby = getPlayersInRadius(tgt.Position, unfreezeRad)
        
        if #nearby > 0 then
            root.Anchored = false
            frozen = false
            if freezeConn then
                freezeConn:Disconnect()
                freezeConn = nil
            end
        elseif tick() - start >= freezeTime then
            root.Anchored = false
            frozen = false
            if freezeConn then
                freezeConn:Disconnect()
                freezeConn = nil
            end
        end
    end)
end

local proxConn
local function startProxScan()
    if proxConn then return end
    proxConn = task.spawn(function()
        while true do
            task.wait(0.1)
            if frozen or not tweening then continue end
            
            local tgt = targets[1]
            local nearby = getPlayersInRadius(tgt.Position, freezeRad)
            
            if #nearby == 0 then
                freeze()
            end
        end
    end)
end

local function getNearSpawn()
    local pos = root.Position
    for _, spawn in ipairs(spawns) do
        if (spawn.Position - pos).Magnitude <= spawnRad then
            return spawn
        end
    end
    return nil
end

local function getClosestTarget()
    local pos = root.Position
    local closest = nil
    local minDist = math.huge
    
    for _, part in ipairs(targets) do
        local dist = (part.Position - pos).Magnitude
        if dist < minDist then
            minDist = dist
            closest = part
        end
    end
    
    return closest
end

local function touch(part)
    if part and root then
        firetouchinterest(root, part, 0)
        wait(0.1)
        firetouchinterest(root, part, 1)
    end
end

local noclipConn

local function enableNoclip()
    if noclipConn then return end
    noclipConn = RunService.Stepped:Connect(function()
        if char then
            for _, part in pairs(char:GetDescendants()) do
                if part:IsA("BasePart") then
                    part.CanCollide = false
                end
            end
        end
    end)
end

local function disableNoclip()
    if noclipConn then
        noclipConn:Disconnect()
        noclipConn = nil
    end
    if char then
        for _, part in pairs(char:GetDescendants()) do
            if part:IsA("BasePart") then
                part.CanCollide = true
            end
        end
    end
end

local function moveToTarget()
    if not root or hum.Health <= 0 then return end
    
    local tgt = getClosestTarget()
    if not tgt then return end
    
    tweenCt = tweenCt + 1
    local spd = baseSpd
    if tweenCt % 2 == 0 then
        spd = math.random(spdMin * 10, spdMax * 10) / 10
    end
    
    local tgtPos = tgt.Position + Vector3.new(0, heightOff, 0)
    local dist = (root.Position - tgtPos).Magnitude
    
    if dist <= targetProx then
        task.wait(math.random(1, 3) * 0.1)
        touch(tgt)
        return
    end
    
    local dur = dist / spd
    local info = TweenInfo.new(dur, Enum.EasingStyle.Linear)
    local tween = TweenService:Create(root, info, {CFrame = CFrame.new(tgtPos)})
    
    local paused = false
    local anchorConn
    local pauseConn
    
    pauseConn = RunService.Heartbeat:Connect(function()
        local curDist = (root.Position - tgtPos).Magnitude
        
        if curDist <= 10 and curDist > anchorDist and not paused then
            paused = true
            tween:Pause()
            root.Anchored = true
            
            local pauseStart = tick()
            local pauseCheck
            pauseCheck = RunService.Heartbeat:Connect(function()
                local nearby = getPlayersInRadius(tgtPos, unfreezeRad)
                
                if #nearby > 0 then
                    root.Anchored = false
                    tween:Play()
                    if pauseCheck then
                        pauseCheck:Disconnect()
                    end
                elseif tick() - pauseStart >= 1.5 then
                    root.Anchored = false
                    tween:Play()
                    if pauseCheck then
                        pauseCheck:Disconnect()
                    end
                end
            end)
        end
        
        if curDist <= anchorDist then
            root.Anchored = true
            if pauseConn then
                pauseConn:Disconnect()
                pauseConn = nil
            end
        end
    end)
    
    anchorConn = RunService.Heartbeat:Connect(function()
        local curDist = (root.Position - tgtPos).Magnitude
        if curDist <= anchorDist then
            root.Anchored = true
            if anchorConn then
                anchorConn:Disconnect()
                anchorConn = nil
            end
        end
    end)
    
    enableNoclip()
    tweening = true
    root.Anchored = false
    tween:Play()
    
    tween.Completed:Wait()
    
    if anchorConn then
        anchorConn:Disconnect()
        anchorConn = nil
    end
    if pauseConn then
        pauseConn:Disconnect()
        pauseConn = nil
    end
    
    root.Anchored = false
    disableNoclip()
    tweening = false
    task.wait(math.random(1, 3) * 0.1)
    touch(tgt)
end

local autoConn
local waiting = false

local function start()
    if autoConn then return end
    startProxScan()
    autoConn = RunService.Heartbeat:Connect(function()
        local near = getNearSpawn()
        
        if near and not waiting then
            waiting = true
            task.wait(waitTime + math.random(-5, 5) * 0.1)
            if waiting then
                moveToTarget()
                waiting = false
            end
        elseif not near then
            waiting = false
        end
    end)
end

local function stop()
    if autoConn then
        autoConn:Disconnect()
        autoConn = nil
    end
    waiting = false
    
    if freezeConn then
        freezeConn:Disconnect()
        freezeConn = nil
    end
    if frozen then
        root.Anchored = false
        frozen = false
    end
    disableNoclip()
end

local gui = Instance.new("ScreenGui")
gui.Name = "AutoCompleteGui"
gui.Parent = plr:WaitForChild("PlayerGui")
gui.ResetOnSpawn = false
gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling

local frame = Instance.new("Frame")
frame.Size = UDim2.new(0, 180, 0, 100)
frame.Position = UDim2.new(0.5, -90, 0.05, 0)
frame.BackgroundColor3 = Color3.fromRGB(20, 20, 25)
frame.BorderSizePixel = 0
frame.Parent = gui

local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 10)
corner.Parent = frame

local stroke = Instance.new("UIStroke")
stroke.Thickness = 2
stroke.Color = Color3.fromRGB(0, 180, 180)
stroke.Transparency = 0
stroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Border
stroke.Parent = frame

local hue = 0
RunService.Heartbeat:Connect(function()
    hue = (hue + 0.005) % 1
    stroke.Color = Color3.fromHSV(hue, 0.8, 1)
end)

local header = Instance.new("Frame")
header.Size = UDim2.new(1, 0, 0, 28)
header.Position = UDim2.new(0, 0, 0, 0)
header.BackgroundColor3 = Color3.fromRGB(30, 30, 35)
header.BorderSizePixel = 0
header.Parent = frame

local headerCorner = Instance.new("UICorner")
headerCorner.CornerRadius = UDim.new(0, 10)
headerCorner.Parent = header

local headerBot = Instance.new("Frame")
headerBot.Size = UDim2.new(1, 0, 0, 10)
headerBot.Position = UDim2.new(0, 0, 1, -10)
headerBot.BackgroundColor3 = Color3.fromRGB(30, 30, 35)
headerBot.BorderSizePixel = 0
headerBot.Parent = header

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

local indicator = Instance.new("Frame")
indicator.Size = UDim2.new(0, 8, 0, 8)
indicator.Position = UDim2.new(1, -15, 0.5, -4)
indicator.BackgroundColor3 = Color3.fromRGB(100, 255, 100)
indicator.BorderSizePixel = 0
indicator.Parent = header

local indCorner = Instance.new("UICorner")
indCorner.CornerRadius = UDim.new(1, 0)
indCorner.Parent = indicator

local btn = Instance.new("TextButton")
btn.Size = UDim2.new(0, 160, 0, 32)
btn.Position = UDim2.new(0.5, -80, 0, 34)
btn.BackgroundColor3 = Color3.fromRGB(100, 200, 100)
btn.BorderSizePixel = 0
btn.Text = "ENABLED"
btn.TextColor3 = Color3.fromRGB(255, 255, 255)
btn.TextSize = 14
btn.Font = Enum.Font.GothamBold
btn.AutoButtonColor = false
btn.Parent = frame

local btnCorner = Instance.new("UICorner")
btnCorner.CornerRadius = UDim.new(0, 7)
btnCorner.Parent = btn

local btnStroke = Instance.new("UIStroke")
btnStroke.Thickness = 1.5
btnStroke.Color = Color3.fromRGB(120, 220, 120)
btnStroke.Transparency = 0.5
btnStroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Border
btnStroke.Parent = btn

local sig = Instance.new("TextLabel")
sig.Size = UDim2.new(1, -20, 0, 20)
sig.Position = UDim2.new(0, 10, 0, 70)
sig.BackgroundTransparency = 1
sig.Text = "Made by Null | @guardi.an"
sig.TextColor3 = Color3.fromRGB(150, 150, 150)
sig.TextSize = 10
sig.Font = Enum.Font.Gotham
sig.TextXAlignment = Enum.TextXAlignment.Center
sig.Parent = frame

btn.MouseEnter:Connect(function()
    TweenService:Create(btn, TweenInfo.new(0.2), {BackgroundColor3 = enabled and Color3.fromRGB(120, 220, 120) or Color3.fromRGB(220, 80, 80)}):Play()
end)

btn.MouseLeave:Connect(function()
    TweenService:Create(btn, TweenInfo.new(0.2), {BackgroundColor3 = enabled and Color3.fromRGB(100, 200, 100) or Color3.fromRGB(200, 60, 60)}):Play()
end)

local dragging = false
local dragStart
local startPos

frame.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
        dragging = true
        dragStart = input.Position
        startPos = frame.Position
        
        input.Changed:Connect(function()
            if input.UserInputState == Enum.UserInputState.End then
                dragging = false
            end
        end)
    end
end)

UserInputService.InputChanged:Connect(function(input)
    if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
        local delta = input.Position - dragStart
        frame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
    end
end)

btn.MouseButton1Click:Connect(function()
    enabled = not enabled
    if enabled then
        btn.Text = "ENABLED"
        btn.BackgroundColor3 = Color3.fromRGB(100, 200, 100)
        btnStroke.Color = Color3.fromRGB(120, 220, 120)
        indicator.BackgroundColor3 = Color3.fromRGB(100, 255, 100)
        start()
        
        local origSize = btn.Size
        TweenService:Create(btn, TweenInfo.new(0.1), {Size = UDim2.new(0, 155, 0, 30)}):Play()
        wait(0.1)
        TweenService:Create(btn, TweenInfo.new(0.1), {Size = origSize}):Play()
    else
        btn.Text = "DISABLED"
        btn.BackgroundColor3 = Color3.fromRGB(200, 60, 60)
        btnStroke.Color = Color3.fromRGB(220, 80, 80)
        indicator.BackgroundColor3 = Color3.fromRGB(255, 80, 80)
        stop()
        
        local origSize = btn.Size
        TweenService:Create(btn, TweenInfo.new(0.1), {Size = UDim2.new(0, 155, 0, 30)}):Play()
        wait(0.1)
        TweenService:Create(btn, TweenInfo.new(0.1), {Size = origSize}):Play()
    end
end)

plr.CharacterAdded:Connect(function(newChar)
    char = newChar
    root = newChar:WaitForChild("HumanoidRootPart")
    hum = newChar:WaitForChild("Humanoid")
    waiting = false
    frozen = false
    tweening = false
    if freezeConn then
        freezeConn:Disconnect()
        freezeConn = nil
    end
    disableNoclip()
    removeKills()
end)

start()

Features & Information

Auto Complete stages in Obby Royale Note: this script will only work if you are IDLE on top of your pillar, moving off the pillar at any point will cancel the tween countdown. - Removed death parts for easy completion of Death Penalty - Wait time of 10 seconds on start to avoid detections - Automatic tweening to stage completion

Community Comments (1)

suchdogesuchdogeFeb 28, 2026

doesnt work on xeno

More Scripts for Obby Royale