DOORS Script (November 2026) – OpenSource

PUBLISHEDUPDATED
1 Available ScriptFree

Running through room after room gets intense, especially when one bad puzzle read can ruin an otherwise solid run. Running a DOORS script takes the edge off those stressful choke points so you can keep moving forward instead of restarting from door one.

DOORS throws you into a dark hotel packed with creepy surprises, flashing lights, and entities waiting to catch you slipping. You work your way through numbered doors, using each death as a quick lesson on what not to do. Along the way, you search dark rooms, gather items, and tackle tricky tasks like hunting down books in the library to crack padlock codes.

This open-source tool focuses on making that library encounter much easier. It reads your book hints, matches them against your paper, and lets you send the solution straight to the padlock so you can clear the room without panicking. Check out the working script below.

DOORS Script – OpenSource

OpenSourceFree
Library Solver | OpenSource
-- Gui by Cloude AI
-- Padlock Solver
-- Made by neW

local guiParent = (gethui and gethui()) or game:GetService("CoreGui")
if guiParent:FindFirstChild("PadlockSolverGui") then
    warn("[PadlockSolver] GUI is already running - script not started")
    return
end

local REFRESH = 0.35

local Players = game:GetService("Players")
local UIS = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local RunService = game:GetService("RunService")
local Debris = game:GetService("Debris")
local lp = Players.LocalPlayer
local pg = lp:WaitForChild("PlayerGui")

local SHAPES = {
    [0] = "Pentagon", [50] = "Triangle", [100] = "Square", [150] = "Star",
    [200] = "X", [250] = "Hexagon", [300] = "Diamond", [350] = "Circle",
}
local TOTAL_SHAPES = 8

local function rectKey(img)
    return string.format("%g,%g", img.ImageRectOffset.X, img.ImageRectOffset.Y)
end

local function shapeName(img)
    return SHAPES[img.ImageRectOffset.X] or ("Rect " .. rectKey(img))
end

local function findPaper()
    local bp = lp:FindFirstChild("Backpack")
    local t = (bp and bp:FindFirstChild("LibraryHintPaper"))
        or (lp.Character and lp.Character:FindFirstChild("LibraryHintPaper"))
    if t then return t end
    local rooms = workspace:FindFirstChild("CurrentRooms")
    return rooms and rooms:FindFirstChild("LibraryHintPaper", true)
end

local function findHints()
    local perm = pg:FindFirstChild("PermUI")
    return perm and perm:FindFirstChild("Hints")
end

local librarySeen = false

local function inLibrary()
    local rooms = workspace:FindFirstChild("CurrentRooms")
    local room = rooms and rooms:FindFirstChild("50")
    local assets = room and room:FindFirstChild("Assets")
    if not assets then
        librarySeen = false
        return false
    end
    if assets:FindFirstChild("LiveHintBook", true) then
        librarySeen = true
    end
    return librarySeen
end

local function slotImage(ui, i)
    local s = ui:FindFirstChild(tostring(i))
    if not s then return nil end
    if s:IsA("ImageLabel") or s:IsA("ImageButton") then return s end
    return s:FindFirstChildWhichIsA("ImageLabel", true)
end

local function solve()
    local res = {paper = false, hintCount = 0, slots = {}}

    local byRect = {}
    local hints = findHints()
    if hints then
        for _, c in ipairs(hints:GetChildren()) do
            if c.Name == "Icon" and c:IsA("ImageLabel") then
                local tl = c:FindFirstChild("TextLabel")
                local num = tl and tostring(tl.Text):match("%d+")
                if num then
                    byRect[rectKey(c)] = {icon = c, num = num}
                    res.hintCount += 1
                end
            end
        end
    end

    local paper = findPaper()
    local ui = paper and paper:FindFirstChild("UI")
    if not ui then return res end
    res.paper = true

    for i = 1, 5 do
        local img = slotImage(ui, i)
        if img then
            local h = byRect[rectKey(img)]
            res.slots[i] = {
                img = img, name = shapeName(img),
                hint = h and h.icon, digit = h and h.num,
            }
        else
            res.slots[i] = {name = "No slot"}
        end
    end
    return res
end

local C = {
    bgTop = Color3.fromRGB(22, 20, 40),
    bgBot = Color3.fromRGB(11, 12, 22),
    bar = Color3.fromRGB(26, 24, 46),
    card = Color3.fromRGB(26, 28, 46),
    cardOk = Color3.fromRGB(18, 52, 50),
    cardBad = Color3.fromRGB(56, 26, 42),
    stroke = Color3.fromRGB(64, 68, 104),
    text = Color3.fromRGB(238, 240, 255),
    sub = Color3.fromRGB(140, 146, 180),
    accent = Color3.fromRGB(150, 110, 255),
    accent2 = Color3.fromRGB(70, 215, 255),
    ok = Color3.fromRGB(80, 255, 170),
    bad = Color3.fromRGB(255, 100, 130),
    warn = Color3.fromRGB(255, 205, 105),
    btn = Color3.fromRGB(38, 40, 64),
    btnHover = Color3.fromRGB(58, 62, 96),
    white = Color3.new(1, 1, 1),
}

local STATE = {
    none = {text = C.sub, box = C.card,    boxStroke = C.stroke, card = C.card,    cardStroke = C.stroke, cardStrokeT = 0.7},
    ok   = {text = C.ok,  box = C.cardOk,  boxStroke = C.ok,     card = C.cardOk,  cardStroke = C.ok,     cardStrokeT = 0.55},
    bad  = {text = C.bad, box = C.cardBad, boxStroke = C.bad,    card = C.cardBad, cardStroke = C.bad,    cardStrokeT = 0.6},
}

local function tween(o, t, props, style, dir)
    local tw = TweenService:Create(o, TweenInfo.new(t, style or Enum.EasingStyle.Quint, dir or Enum.EasingDirection.Out), props)
    tw:Play()
    return tw
end

local function new(class, props, par)
    local o = Instance.new(class)
    for k, v in pairs(props) do o[k] = v end
    if par then o.Parent = par end
    return o
end

local function round(o, r)
    return new("UICorner", {CornerRadius = UDim.new(0, r)}, o)
end

local function label(par, props)
    local p = {
        BackgroundTransparency = 1, TextColor3 = C.text, Font = Enum.Font.Gotham,
        TextSize = 13, TextXAlignment = Enum.TextXAlignment.Left,
    }
    for k, v in pairs(props) do p[k] = v end
    return new("TextLabel", p, par)
end

local function seq(a, b)
    return ColorSequence.new({
        ColorSequenceKeypoint.new(0, a),
        ColorSequenceKeypoint.new(0.5, b),
        ColorSequenceKeypoint.new(1, a),
    })
end

local function setThumb(thumb, src)
    if not src then thumb.Visible = false return end
    thumb.Visible = true
    thumb.Image = src.Image
    thumb.ImageRectOffset = src.ImageRectOffset
    thumb.ImageRectSize = src.ImageRectSize
    thumb.ImageColor3 = src.ImageColor3
    thumb.ImageTransparency = 0
end

local parent = guiParent

local gui = new("ScreenGui", {
    Name = "PadlockSolverGui", ResetOnSpawn = false, ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
}, parent)

local WIDTH, FULL_H, MINI_H, NOTICE_H, HOME_Y = 360, 396, 172, 80, 14

local win = new("Frame", {
    Size = UDim2.new(0, WIDTH, 0, FULL_H),
    AnchorPoint = Vector2.new(0.5, 0),
    Position = UDim2.new(0.5, 0, 0, -40),
    BackgroundColor3 = C.white, BorderSizePixel = 0, ClipsDescendants = true,
}, gui)
round(win, 12)
new("UIGradient", {Color = ColorSequence.new(C.bgTop, C.bgBot), Rotation = 90}, win)
local winScale = new("UIScale", {Scale = 0.85}, win)

local winStroke = new("UIStroke", {Color = C.white, Thickness = 1.5, Transparency = 0.1}, win)
local strokeGrad = new("UIGradient", {Color = seq(C.accent, C.accent2)}, winStroke)

local themeGrads = {strokeGrad}
local currentTheme
local THEMES = {
    idle = {C.accent, C.accent2},
    ok = {C.ok, C.accent2},
    warn = {C.warn, C.accent},
}
local function setTheme(name)
    if currentTheme == name then return end
    currentTheme = name
    local t = THEMES[name]
    for _, g in ipairs(themeGrads) do g.Color = seq(t[1], t[2]) end
end

local bar = new("Frame", {Size = UDim2.new(1, 0, 0, 40), BackgroundColor3 = C.bar, BorderSizePixel = 0}, win)
round(bar, 12)
new("Frame", {
    Size = UDim2.new(1, 0, 0, 12), Position = UDim2.new(0, 0, 1, -12),
    BackgroundColor3 = C.bar, BorderSizePixel = 0,
}, bar)

local titleLbl = label(bar, {
    Size = UDim2.new(1, -170, 0, 18), Position = UDim2.new(0, 14, 0, 5),
    Text = "PADLOCK SOLVER", TextColor3 = C.white, Font = Enum.Font.GothamBold, TextSize = 13,
})
local titleGrad = new("UIGradient", {Color = seq(C.accent, C.accent2)}, titleLbl)
themeGrads[#themeGrads + 1] = titleGrad

local subLbl = label(bar, {
    Size = UDim2.new(1, -170, 0, 14), Position = UDim2.new(0, 14, 0, 23),
    Text = "Library  |  hints 0/" .. TOTAL_SHAPES, TextColor3 = C.sub, TextSize = 11,
})

local accentLine = new("Frame", {
    Size = UDim2.new(1, 0, 0, 2), Position = UDim2.new(0, 0, 0, 40),
    BackgroundColor3 = C.white, BorderSizePixel = 0,
}, win)
local lineGrad = new("UIGradient", {Color = seq(C.accent, C.accent2)}, accentLine)
themeGrads[#themeGrads + 1] = lineGrad

local function barButton(text, xFromRight, w, cb, hoverCol)
    local b = new("TextButton", {
        Size = UDim2.new(0, w, 0, 24), Position = UDim2.new(1, -xFromRight, 0, 8),
        BackgroundColor3 = C.btn, TextColor3 = C.text, Font = Enum.Font.GothamBold,
        TextSize = 11, Text = text, AutoButtonColor = false,
    }, bar)
    round(b, 6)
    local st = new("UIStroke", {Color = C.stroke, Thickness = 1, Transparency = 0.5}, b)
    local sc = new("UIScale", {}, b)
    local hc = hoverCol or C.accent2
    b.MouseEnter:Connect(function()
        tween(b, 0.15, {BackgroundColor3 = C.btnHover})
        tween(st, 0.15, {Color = hc, Transparency = 0})
    end)
    b.MouseLeave:Connect(function()
        tween(b, 0.2, {BackgroundColor3 = C.btn})
        tween(st, 0.2, {Color = C.stroke, Transparency = 0.5})
        tween(sc, 0.12, {Scale = 1})
    end)
    b.MouseButton1Down:Connect(function() tween(sc, 0.08, {Scale = 0.92}) end)
    b.MouseButton1Up:Connect(function() tween(sc, 0.15, {Scale = 1}, Enum.EasingStyle.Back) end)
    b.MouseButton1Click:Connect(cb)
    return b
end

local dragging, dragStart, startPos = false, nil, nil
bar.InputBegan:Connect(function(i)
    if i.UserInputType == Enum.UserInputType.MouseButton1 or i.UserInputType == Enum.UserInputType.Touch then
        dragging, dragStart, startPos = true, i.Position, win.Position
        i.Changed:Connect(function()
            if i.UserInputState == Enum.UserInputState.End then dragging = false end
        end)
    end
end)
local dragConn
dragConn = UIS.InputChanged:Connect(function(i)
    if not gui.Parent then dragConn:Disconnect() return end
    if dragging and (i.UserInputType == Enum.UserInputType.MouseMovement
        or i.UserInputType == Enum.UserInputType.Touch) then
        local d = i.Position - dragStart
        win.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + d.X,
            startPos.Y.Scale, startPos.Y.Offset + d.Y)
    end
end)

local digitBoxes, digitScales, boxStrokes = {}, {}, {}
local BOX_W, BOX_H, BOX_GAP, BOX_Y = 58, 56, 6, 50
local boxStart = (WIDTH - (5 * BOX_W + 4 * BOX_GAP)) / 2
for i = 1, 5 do
    local b = new("TextLabel", {
        Size = UDim2.new(0, BOX_W, 0, BOX_H),
        AnchorPoint = Vector2.new(0.5, 0.5),
        Position = UDim2.new(0, boxStart + (i - 1) * (BOX_W + BOX_GAP) + BOX_W / 2, 0, BOX_Y + BOX_H / 2),
        BackgroundColor3 = C.card, TextColor3 = C.sub, Font = Enum.Font.GothamBold,
        TextSize = 28, Text = "-",
    }, win)
    round(b, 10)
    boxStrokes[i] = new("UIStroke", {Color = C.stroke, Thickness = 1.5}, b)
    digitScales[i] = new("UIScale", {Scale = 0}, b)
    digitBoxes[i] = b
end

local track = new("Frame", {
    Size = UDim2.new(1, -28, 0, 4), Position = UDim2.new(0, 14, 0, 114),
    BackgroundColor3 = C.card, BorderSizePixel = 0,
}, win)
round(track, 2)
local fill = new("Frame", {Size = UDim2.new(0, 0, 1, 0), BackgroundColor3 = C.white, BorderSizePixel = 0}, track)
round(fill, 2)
local fillGrad = new("UIGradient", {Color = seq(C.accent, C.accent2)}, fill)
themeGrads[#themeGrads + 1] = fillGrad

local statusBox = new("Frame", {
    Size = UDim2.new(1, -24, 0, 36), Position = UDim2.new(0, 12, 0, 124),
    BackgroundColor3 = C.card, BorderSizePixel = 0,
}, win)
round(statusBox, 8)
new("UIStroke", {Color = C.stroke, Thickness = 1, Transparency = 0.6}, statusBox)

local dot = new("Frame", {
    Size = UDim2.new(0, 8, 0, 8), Position = UDim2.new(0, 11, 0.5, -4),
    BackgroundColor3 = C.sub, BorderSizePixel = 0,
}, statusBox)
round(dot, 99)

local statusLbl = label(statusBox, {
    Size = UDim2.new(1, -36, 1, -4), Position = UDim2.new(0, 28, 0, 2),
    Text = "", TextSize = 12, TextColor3 = C.sub,
    TextWrapped = true, TextTruncate = Enum.TextTruncate.AtEnd,
    TextYAlignment = Enum.TextYAlignment.Center,
})

local noticeFrame = new("Frame", {
    Size = UDim2.new(1, -24, 0, 38), AnchorPoint = Vector2.new(0.5, 0.5),
    Position = UDim2.new(0.5, 0, 0, 61), BackgroundTransparency = 1, Visible = false,
}, win)
local noticeScale = new("UIScale", {Scale = 0}, noticeFrame)
local noticeIcon = new("Frame", {
    Size = UDim2.new(0, 24, 0, 24), Position = UDim2.new(0, 6, 0.5, -12),
    BackgroundColor3 = C.warn, BorderSizePixel = 0,
}, noticeFrame)
round(noticeIcon, 99)
label(noticeIcon, {
    Size = UDim2.new(1, 0, 1, 0), Text = "!", TextColor3 = C.bgBot, Font = Enum.Font.GothamBold,
    TextSize = 15, TextXAlignment = Enum.TextXAlignment.Center,
})
local noticeLbl = label(noticeFrame, {
    Size = UDim2.new(1, -44, 1, 0), Position = UDim2.new(0, 40, 0, 0),
    Text = "You are not in a library!", TextColor3 = C.warn, Font = Enum.Font.GothamBold,
    TextSize = 14, TextTruncate = Enum.TextTruncate.AtEnd,
})

local rowsFrame = new("Frame", {
    Size = UDim2.new(1, -24, 0, 216), Position = UDim2.new(0, 12, 0, 168), BackgroundTransparency = 1,
}, win)
new("UIListLayout", {Padding = UDim.new(0, 4), SortOrder = Enum.SortOrder.LayoutOrder}, rowsFrame)

local rows, rowScales = {}, {}
for i = 1, 5 do
    local holder = new("Frame", {
        Size = UDim2.new(1, 0, 0, 40), BackgroundTransparency = 1, LayoutOrder = i,
    }, rowsFrame)

    local card = new("Frame", {
        Size = UDim2.new(1, 0, 1, 0), AnchorPoint = Vector2.new(0.5, 0.5),
        Position = UDim2.new(0.5, 0, 0.5, 0), BackgroundColor3 = C.card, BorderSizePixel = 0,
    }, holder)
    round(card, 8)
    local cardStroke = new("UIStroke", {Color = C.stroke, Thickness = 1, Transparency = 0.7}, card)
    rowScales[i] = new("UIScale", {Scale = 0}, card)

    label(card, {
        Size = UDim2.new(0, 22, 1, 0), Position = UDim2.new(0, 10, 0, 0),
        Text = tostring(i), TextColor3 = C.sub, TextSize = 13, Font = Enum.Font.GothamBold,
    })

    local pThumb = new("ImageLabel", {
        Size = UDim2.new(0, 30, 0, 30), Position = UDim2.new(0, 32, 0, 5),
        BackgroundColor3 = Color3.fromRGB(215, 215, 220), ScaleType = Enum.ScaleType.Fit,
    }, card)
    round(pThumb, 6)

    local nameLbl = label(card, {
        Size = UDim2.new(0, 90, 1, 0), Position = UDim2.new(0, 70, 0, 0),
        Text = "-", TextSize = 13, TextTruncate = Enum.TextTruncate.AtEnd,
    })

    local arrow = label(card, {
        Size = UDim2.new(0, 18, 1, 0), Position = UDim2.new(0, 162, 0, 0),
        Text = "=", TextColor3 = C.accent2, TextSize = 13, Font = Enum.Font.GothamBold,
        TextXAlignment = Enum.TextXAlignment.Center,
    })

    local hThumb = new("ImageLabel", {
        Size = UDim2.new(0, 30, 0, 30), Position = UDim2.new(0, 186, 0, 5),
        BackgroundColor3 = Color3.fromRGB(70, 72, 100), ScaleType = Enum.ScaleType.Fit, Visible = false,
    }, card)
    round(hThumb, 6)

    local valLbl = label(card, {
        Size = UDim2.new(0, 96, 1, 0), Position = UDim2.new(0, 228, 0, 0),
        Text = "", TextSize = 20, Font = Enum.Font.GothamBold, TextTruncate = Enum.TextTruncate.AtEnd,
    })

    local emptyLbl = label(card, {
        Size = UDim2.new(1, -44, 1, 0), Position = UDim2.new(0, 34, 0, 0),
        Text = "No library paper!", TextColor3 = C.warn, Font = Enum.Font.GothamBold,
        TextSize = 13, Visible = false, TextTruncate = Enum.TextTruncate.AtEnd,
    })

    rows[i] = {
        card = card, stroke = cardStroke, pThumb = pThumb, nameLbl = nameLbl, arrow = arrow,
        hThumb = hThumb, valLbl = valLbl, empty = emptyLbl, state = nil,
    }
end

local fx = new("Frame", {
    Size = UDim2.new(1, 0, 1, 0), BackgroundTransparency = 1, ZIndex = 20,
}, win)

local closed = false
local finished = false
local pulse = false
local notLibrary, absentSince = false, nil
local mode = "full"
local lastCompleteCode, lastCelebrated = nil, nil
local completeCode = nil
local flashText, flashColor, flashUntil = nil, C.text, 0
local lastCount = -1
local statusColor

local function setStatus(text, color, pulsing)
    pulse = pulsing
    if statusLbl.Text ~= text then
        statusLbl.Text = text
        statusLbl.TextTransparency = 1
        tween(statusLbl, 0.25, {TextTransparency = 0})
    end
    if statusColor ~= color then
        statusColor = color
        tween(statusLbl, 0.3, {TextColor3 = color})
        tween(dot, 0.3, {BackgroundColor3 = color})
    end
end

local function flash(text, color, duration)
    flashText, flashColor, flashUntil = text, color or C.text, os.clock() + (duration or 1.6)
    setStatus(flashText, flashColor, false)
end

local function pop(i, delay)
    task.delay(delay or 0, function()
        if closed then return end
        local s = digitScales[i]
        s.Scale = 1.3
        tween(s, 0.5, {Scale = 1}, Enum.EasingStyle.Back)
    end)
end

local function burst(cx, cy, count)
    local ox, oy = cx or WIDTH / 2, cy or (BOX_Y + BOX_H / 2)
    for i = 1, (count or 24) do
        local p = new("Frame", {
            Size = UDim2.new(0, 5, 0, 5), AnchorPoint = Vector2.new(0.5, 0.5),
            Position = UDim2.new(0, ox, 0, oy), BorderSizePixel = 0, ZIndex = 20,
            BackgroundColor3 = (i % 3 == 0) and C.white or ((i % 2 == 0) and C.ok or C.accent2),
        }, fx)
        round(p, 3)
        local ang = math.random() * math.pi * 2
        local dist = 60 + math.random() * 100
        tween(p, 0.7 + math.random() * 0.5, {
            Position = UDim2.new(0, ox + math.cos(ang) * dist, 0, oy + math.sin(ang) * dist * 0.75),
            BackgroundTransparency = 1,
            Size = UDim2.new(0, 2, 0, 2),
            Rotation = math.random(-180, 180),
        })
        Debris:AddItem(p, 1.4)
    end
end

local function celebrate()
    for i = 1, 5 do pop(i, (i - 1) * 0.07) end
    burst()
    tween(winStroke, 0.18, {Thickness = 3.5})
    task.delay(0.2, function()
        if not closed then tween(winStroke, 0.5, {Thickness = 1.5}) end
    end)
end

local minimized = false
local SEND_H = 50
local sendExtra = 0
local placeSend

local function baseHeight()
    return minimized and MINI_H or FULL_H
end

local function setTop(v)
    for i = 1, 5 do digitBoxes[i].Visible = v end
    track.Visible = v
    statusBox.Visible = v
end

local function applyMode()
    if finished then return end
    local m
    if notLibrary then m = "notice" else m = minimized and "mini" or "full" end
    if m == mode then return end
    mode = m

    if m == "notice" then
        tween(win, 0.5, {Size = UDim2.new(0, WIDTH, 0, NOTICE_H)})
        task.delay(0.2, function()
            if closed or mode ~= "notice" then return end
            setTop(false)
            rowsFrame.Visible = false
            noticeScale.Scale = 0
            noticeFrame.Visible = true
            tween(noticeScale, 0.45, {Scale = 1}, Enum.EasingStyle.Back)
        end)
    else
        noticeFrame.Visible = false
        setTop(true)
        if m == "full" then
            rowsFrame.Visible = true
            tween(win, 0.45, {Size = UDim2.new(0, WIDTH, 0, FULL_H + sendExtra)}, Enum.EasingStyle.Back)
        else
            tween(win, 0.4, {Size = UDim2.new(0, WIDTH, 0, MINI_H + sendExtra)})
            task.delay(0.4, function()
                if mode == "mini" then rowsFrame.Visible = false end
            end)
        end
    end
    if placeSend then placeSend() end
end

local function closeGui()
    if closed then return end
    closed = true
    dragConn:Disconnect()
    tween(winScale, 0.3, {Scale = 0}, Enum.EasingStyle.Back, Enum.EasingDirection.In)
    task.delay(0.32, function() gui:Destroy() end)
end

barButton("X", 34, 26, closeGui, C.bad)

local miniBtn
miniBtn = barButton("-", 66, 26, function()
    minimized = not minimized
    miniBtn.Text = minimized and "+" or "-"
    applyMode()
end)

local copyBtn
copyBtn = barButton("COPY", 138, 66, function()
    if mode == "notice" or finished then return end
    if completeCode and setclipboard then
        setclipboard(completeCode)
        flash("Copied: " .. completeCode, C.ok)
        copyBtn.Text = "COPIED"
        task.delay(1.6, function()
            if copyBtn.Parent then copyBtn.Text = "COPY" end
        end)
    elseif completeCode then
        flash("setclipboard is not supported by your executor", C.warn)
    else
        flash("Code incomplete - hints are missing", C.bad)
    end
end)

local ReplicatedStorage = game:GetService("ReplicatedStorage")

local READY_BASE = Color3.fromRGB(22, 70, 64)
local READY_HOVER = Color3.fromRGB(30, 98, 88)

local sending, sendShown, hideToken, lastLabelCode = false, false, 0, nil
local completedCode = nil

local sendBtn = new("TextButton", {
    Size = UDim2.new(1, -24, 0, 40), AnchorPoint = Vector2.new(0.5, 0),
    Position = UDim2.new(0.5, 0, 0, FULL_H - 4),
    BackgroundColor3 = READY_BASE, BorderSizePixel = 0, AutoButtonColor = false,
    Text = "", ClipsDescendants = true, Visible = false, ZIndex = 2,
}, win)
round(sendBtn, 10)
local sendStroke = new("UIStroke", {Color = C.white, Thickness = 1.5}, sendBtn)
local sendStrokeGrad = new("UIGradient", {Color = seq(C.ok, C.accent2)}, sendStroke)
local sendScale = new("UIScale", {Scale = 0}, sendBtn)

local sendFill = new("Frame", {
    Size = UDim2.new(0, 0, 1, 0), BackgroundColor3 = C.accent2,
    BackgroundTransparency = 0.55, BorderSizePixel = 0, ZIndex = 2,
}, sendBtn)
local sendShine = new("Frame", {
    Size = UDim2.new(1, 0, 1, 0), BackgroundColor3 = C.white, BorderSizePixel = 0, ZIndex = 3,
}, sendBtn)
local shineGrad = new("UIGradient", {
    Transparency = NumberSequence.new({
        NumberSequenceKeypoint.new(0, 1),
        NumberSequenceKeypoint.new(0.4, 1),
        NumberSequenceKeypoint.new(0.5, 0.8),
        NumberSequenceKeypoint.new(0.6, 1),
        NumberSequenceKeypoint.new(1, 1),
    }),
    Rotation = 20,
}, sendShine)
local sendLbl = label(sendBtn, {
    Size = UDim2.new(1, 0, 1, 0), Text = "SEND CODE", TextColor3 = C.ok,
    Font = Enum.Font.GothamBold, TextSize = 15,
    TextXAlignment = Enum.TextXAlignment.Center, ZIndex = 4,
})

local function fireCode(code)
    local folder = ReplicatedStorage:WaitForChild("RemotesFolder", 3)
    local remote = folder and folder:WaitForChild("PL", 3)
    if not remote then return false, "remote PL not found" end
    local args = {code}
    return pcall(function()
        remote:FireServer(unpack(args))
    end)
end

local function shake(obj)
    local base = obj.Position
    task.spawn(function()
        for _, dx in ipairs({-6, 6, -5, 5, -3, 3, 0}) do
            if closed then return end
            tween(obj, 0.04, {Position = base + UDim2.new(0, dx, 0, 0)}, Enum.EasingStyle.Sine)
            task.wait(0.04)
        end
        obj.Position = base
    end)
end

local function sendY()
    return UDim2.new(0.5, 0, 0, baseHeight() - 4)
end

placeSend = function()
    if sendShown then tween(sendBtn, 0.4, {Position = sendY()}) end
end

local function resizeWin(grow)
    if mode == "notice" then return end
    tween(win, 0.45, {Size = UDim2.new(0, WIDTH, 0, baseHeight() + sendExtra)},
        grow and Enum.EasingStyle.Back or Enum.EasingStyle.Quint)
end

local function showSend()
    sendShown = true
    hideToken += 1
    sendExtra = SEND_H
    sendBtn.Position = sendY()
    sendBtn.Visible = true
    sendScale.Scale = 0
    tween(sendScale, 0.55, {Scale = 1}, Enum.EasingStyle.Back)
    resizeWin(true)
end

local function hideSend()
    sendShown = false
    lastLabelCode = nil
    sendExtra = 0
    hideToken += 1
    local tok = hideToken
    tween(sendScale, 0.25, {Scale = 0}, Enum.EasingStyle.Back, Enum.EasingDirection.In)
    task.delay(0.27, function()
        if hideToken == tok and not sendShown and sendBtn.Parent then sendBtn.Visible = false end
    end)
    resizeWin(false)
end

local function refreshSend()
    if closed or finished then return end
    if not completeCode then completedCode = nil end
    local want = completeCode ~= nil and mode ~= "notice"
    if want then
        if not sendShown then showSend() end
        if not sending and lastLabelCode ~= completeCode then
            lastLabelCode = completeCode
            sendLbl.Text = "SEND CODE: " .. completeCode
        end
    elseif sendShown then
        hideSend()
    end
end

local CONFETTI = {C.ok, C.accent, C.accent2, C.warn, C.bad, C.white}

local function ring(cx, cy, delay, col, size)
    task.delay(delay, function()
        if closed then return end
        local r = new("Frame", {
            Size = UDim2.new(0, 10, 0, 10), AnchorPoint = Vector2.new(0.5, 0.5),
            Position = UDim2.new(0, cx, 0, cy), BackgroundTransparency = 1, ZIndex = 21,
        }, fx)
        round(r, 999)
        local st = new("UIStroke", {Color = col, Thickness = 4}, r)
        tween(r, 0.8, {Size = UDim2.new(0, size, 0, size)})
        tween(st, 0.8, {Transparency = 1, Thickness = 1})
        Debris:AddItem(r, 1)
    end)
end

local function confettiRain(count)
    local h = baseHeight() + sendExtra
    for _ = 1, count do
        task.delay(math.random() * 0.5, function()
            if closed then return end
            local w = math.random(4, 8)
            local x = math.random(0, WIDTH)
            local rot = math.random(0, 360)
            local p = new("Frame", {
                Size = UDim2.new(0, w, 0, w * math.random(1, 2)),
                AnchorPoint = Vector2.new(0.5, 0.5),
                Position = UDim2.new(0, x, 0, -12),
                BackgroundColor3 = CONFETTI[math.random(#CONFETTI)],
                BorderSizePixel = 0, ZIndex = 22, Rotation = rot,
            }, fx)
            local t = 1.1 + math.random() * 1.1
            tween(p, t, {
                Position = UDim2.new(0, x + math.random(-40, 40), 0, h + 12),
                Rotation = rot + math.random(-540, 540),
            }, Enum.EasingStyle.Quad, Enum.EasingDirection.In)
            task.delay(t * 0.7, function()
                if p.Parent then tween(p, t * 0.3, {BackgroundTransparency = 1}) end
            end)
            Debris:AddItem(p, t + 0.2)
        end)
    end
end

local function sparkles(cx, cy, count)
    for _ = 1, count do
        task.delay(math.random() * 0.45, function()
            if closed then return end
            local sz = math.random(8, 14)
            local sp = new("Frame", {
                Size = UDim2.new(0, 2, 0, 2), AnchorPoint = Vector2.new(0.5, 0.5),
                Position = UDim2.new(0, cx + math.random(-150, 150), 0, cy + math.random(-26, 26)),
                BackgroundColor3 = C.white, BorderSizePixel = 0, Rotation = 45, ZIndex = 23,
            }, fx)
            tween(sp, 0.25, {Size = UDim2.new(0, sz, 0, sz)}, Enum.EasingStyle.Back)
            task.delay(0.3, function()
                if sp.Parent then
                    tween(sp, 0.45, {Size = UDim2.new(0, 0, 0, 0), BackgroundTransparency = 1, Rotation = 225})
                end
            end)
            Debris:AddItem(sp, 0.9)
        end)
    end
end

local function banner()
    local h = baseHeight() + sendExtra
    local pill = new("Frame", {
        Size = UDim2.new(0, 300, 0, 54), AnchorPoint = Vector2.new(0.5, 0.5),
        Position = UDim2.new(0.5, 0, 0, h / 2), BackgroundColor3 = C.cardOk,
        BorderSizePixel = 0, ZIndex = 30,
    }, fx)
    round(pill, 14)
    local st = new("UIStroke", {Color = C.white, Thickness = 2}, pill)
    local sg = new("UIGradient", {Color = seq(C.ok, C.accent2)}, st)
    local sc = new("UIScale", {Scale = 0}, pill)
    local lbl = label(pill, {
        Size = UDim2.new(1, 0, 1, 0), Text = "PUZZLE COMPLETED!", TextColor3 = C.ok,
        Font = Enum.Font.GothamBold, TextSize = 21,
        TextXAlignment = Enum.TextXAlignment.Center, ZIndex = 31,
    })
    tween(sc, 0.5, {Scale = 1}, Enum.EasingStyle.Back)
    task.spawn(function()
        local t0 = os.clock()
        while pill.Parent and not closed and os.clock() - t0 < 2.2 do
            local e = os.clock() - t0
            sg.Rotation = (e * 360) % 360
            lbl.TextColor3 = C.ok:Lerp(C.white, 0.5 * (0.5 + 0.5 * math.sin(e * 10)))
            task.wait()
        end
        if closed or not pill.Parent then return end
        tween(sc, 0.3, {Scale = 0}, Enum.EasingStyle.Back, Enum.EasingDirection.In)
        Debris:AddItem(pill, 0.4)
    end)
end

local function completeFx()
    local cx = WIDTH / 2
    local cy = baseHeight() - 4 + 20

    celebrate()
    burst(cx, cy, 36)
    ring(cx, cy, 0, C.ok, 360)
    ring(cx, cy, 0.12, C.accent2, 300)
    ring(cx, cy, 0.24, C.white, 240)
    confettiRain(46)
    sparkles(cx, cy, 16)
    banner()

    local f = new("Frame", {
        Size = UDim2.new(1, 0, 1, 0), BackgroundColor3 = C.white,
        BackgroundTransparency = 0.55, BorderSizePixel = 0, ZIndex = 19,
    }, fx)
    round(f, 12)
    tween(f, 0.7, {BackgroundTransparency = 1})
    Debris:AddItem(f, 0.8)

    winScale.Scale = 1.06
    tween(winScale, 0.6, {Scale = 1}, Enum.EasingStyle.Back)

    for i = 1, 5 do
        task.delay(0.05 * (i - 1), function()
            if closed then return end
            tween(boxStrokes[i], 0.15, {Thickness = 4})
            task.delay(0.2, function()
                if closed then return end
                tween(boxStrokes[i], 0.5, {Thickness = 1.5})
            end)
        end)
    end
end

local function shrinkOut(obj, delay)
    local sc = obj:FindFirstChildOfClass("UIScale") or new("UIScale", {}, obj)
    task.delay(delay, function()
        if closed then return end
        tween(sc, 0.3, {Scale = 0}, Enum.EasingStyle.Back, Enum.EasingDirection.In)
    end)
end

local function dismissGui()
    if finished or closed then return end
    finished = true
    pulse = false

    track.AnchorPoint = Vector2.new(0.5, 0.5)
    track.Position = UDim2.new(0.5, 0, 0, 116)
    statusBox.AnchorPoint = Vector2.new(0.5, 0.5)
    statusBox.Position = UDim2.new(0.5, 0, 0, 142)

    for i = 1, 5 do
        shrinkOut(digitBoxes[i], (i - 1) * 0.07)
        shrinkOut(rows[i].card, 0.35 + (i - 1) * 0.07)
    end
    shrinkOut(track, 0.3)
    shrinkOut(statusBox, 0.35)
    shrinkOut(sendBtn, 0.7)

    task.delay(1.2, function()
        if closed then return end
        tween(win, 0.4, {Size = UDim2.new(0, WIDTH, 0, 42)})
    end)
    task.delay(1.7, closeGui)
end

local function sendCode()
    if closed or sending or not sendShown then return end
    local code = completeCode
    if not code then return end

    sending = true
    sendLbl.Text = "SENDING"
    sendLbl.TextColor3 = C.white
    tween(sendBtn, 0.2, {BackgroundColor3 = READY_BASE})
    sendFill.Size = UDim2.new(0, 0, 1, 0)
    sendFill.BackgroundTransparency = 0.55
    tween(sendFill, 0.6, {Size = UDim2.new(1, 0, 1, 0)}, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut)
    flash("Sending code " .. code .. "...", C.accent2, 1)

    for i = 1, 5 do
        task.delay((i - 1) * 0.09, function()
            if closed then return end
            pop(i, 0)
            tween(boxStrokes[i], 0.12, {Color = C.accent2, Thickness = 3})
            task.delay(0.3, function()
                if closed then return end
                tween(boxStrokes[i], 0.35, {Color = C.ok, Thickness = 1.5})
            end)
        end)
    end

    task.spawn(function()
        task.wait(0.65)
        if closed then return end

        local ok, err = fireCode(code)
        if closed then return end

        tween(sendFill, 0.3, {BackgroundTransparency = 1})
        if ok then
            print("[PadlockSolver] sent code:", code)
            completedCode = code
            sendLbl.Text = "PUZZLE COMPLETED!"
            sendLbl.TextColor3 = C.bgBot
            tween(sendBtn, 0.25, {BackgroundColor3 = C.ok})
            completeFx()
            flash("Puzzle completed!", C.ok, 2.5)
        else
            warn("[PadlockSolver] send failed:", err)
            sendLbl.Text = "FAILED"
            sendLbl.TextColor3 = C.bad
            tween(sendBtn, 0.25, {BackgroundColor3 = C.cardBad})
            shake(sendBtn)
            flash("Send failed: " .. tostring(err), C.bad, 3)
        end

        task.wait(ok and 2.6 or 1.6)
        if closed then return end
        if ok then
            dismissGui()
            return
        end
        sending = false
        sendFill.Size = UDim2.new(0, 0, 1, 0)
        sendLbl.TextColor3 = C.ok
        tween(sendBtn, 0.3, {BackgroundColor3 = READY_BASE})
        lastLabelCode = nil
        refreshSend()
    end)
end

sendBtn.MouseEnter:Connect(function()
    if sending then return end
    tween(sendBtn, 0.15, {BackgroundColor3 = READY_HOVER})
    tween(sendStroke, 0.15, {Thickness = 2.5})
end)
sendBtn.MouseLeave:Connect(function()
    tween(sendStroke, 0.2, {Thickness = 1.5})
    tween(sendScale, 0.12, {Scale = 1})
    if not sending then tween(sendBtn, 0.2, {BackgroundColor3 = READY_BASE}) end
end)
sendBtn.MouseButton1Down:Connect(function() tween(sendScale, 0.08, {Scale = 0.95}) end)
sendBtn.MouseButton1Up:Connect(function() tween(sendScale, 0.15, {Scale = 1}, Enum.EasingStyle.Back) end)
sendBtn.MouseButton1Click:Connect(sendCode)

local function applyRow(i, s)
    local r, box = rows[i], digitBoxes[i]
    local dg = s and s.digit
    local state = (not s) and "none" or (dg and "ok" or "bad")

    local txt = dg or (s and "?" or "-")
    if box.Text ~= txt then
        box.Text = txt
        if dg then pop(i, 0) end
    end

    if r.state ~= state then
        r.state = state
        local st = STATE[state]
        tween(box, 0.35, {TextColor3 = st.text, BackgroundColor3 = st.box})
        tween(boxStrokes[i], 0.35, {Color = st.boxStroke})
        tween(r.card, 0.35, {BackgroundColor3 = st.card})
        tween(r.stroke, 0.35, {Color = st.cardStroke, Transparency = st.cardStrokeT})
    end

    local none = state == "none"
    r.empty.Visible = none
    r.nameLbl.Visible = not none
    r.arrow.Visible = not none
    r.valLbl.Visible = not none

    setThumb(r.pThumb, s and s.img)
    r.nameLbl.Text = s and s.name or "-"
    setThumb(r.hThumb, s and s.hint)

    if state == "ok" then
        r.valLbl.Text = dg
        r.valLbl.TextColor3 = C.ok
        r.valLbl.TextSize = 20
    elseif state == "bad" then
        r.valLbl.Text = "no hint"
        r.valLbl.TextColor3 = C.bad
        r.valLbl.TextSize = 13
    else
        r.valLbl.Text = ""
    end
end

local function update()
    if finished then return end
    local d = solve()
    local flashing = flashText and os.clock() < flashUntil

    local function show(text, color, pulsing)
        if flashing then
            setStatus(flashText, flashColor, false)
        else
            setStatus(text, color, pulsing)
        end
    end

    if d.hintCount ~= lastCount then
        lastCount = d.hintCount
        subLbl.Text = string.format("Library  |  hints %d/%d", d.hintCount, TOTAL_SHAPES)
        tween(fill, 0.5, {Size = UDim2.new(math.clamp(d.hintCount / TOTAL_SHAPES, 0, 1), 0, 1, 0)})
    end

    if inLibrary() or d.paper or d.hintCount > 0 then
        absentSince = nil
        notLibrary = false
    else
        absentSince = absentSince or os.clock()
        if os.clock() - absentSince > 1 then notLibrary = true end
    end
    applyMode()

    if notLibrary then
        for i = 1, 5 do applyRow(i, nil) end
        completeCode, lastCelebrated = nil, nil
        setTheme("warn")
        return
    end

    if not d.paper then
        for i = 1, 5 do applyRow(i, nil) end
        completeCode, lastCelebrated = nil, nil
        setTheme("warn")
        show("Pick up the LibraryHintPaper (backpack or hands)", C.warn, true)
        return
    end

    local digits, missing = {}, {}
    for i = 1, 5 do
        local s = d.slots[i]
        applyRow(i, s)
        digits[i] = (s and s.digit) or "?"
        if not (s and s.digit) then
            missing[#missing + 1] = s and s.name or ("Slot " .. i)
        end
    end

    if #missing == 0 then
        local code = table.concat(digits)
        completeCode = code
        setTheme("ok")
        if completedCode == code then
            show("Puzzle completed!", C.ok, false)
        else
            show("Ready - enter the code from left to right", C.ok, false)
        end
        if code ~= lastCelebrated then
            lastCelebrated = code
            print("[PadlockSolver] code:", code)
            celebrate()
        end
    else
        completeCode, lastCelebrated = nil, nil
        setTheme("idle")
        local shown = {}
        for i = 1, math.min(3, #missing) do shown[i] = missing[i] end
        local txt = "Missing hints: " .. table.concat(shown, ", ")
        if #missing > 3 then txt = txt .. string.format(" +%d more", #missing - 3) end
        show(txt, C.warn, true)
    end
end

local t0 = os.clock()
local hbConn
hbConn = RunService.Heartbeat:Connect(function()
    if not gui.Parent then hbConn:Disconnect() return end
    local t = os.clock() - t0
    strokeGrad.Rotation = (t * 70) % 360
    lineGrad.Offset = Vector2.new(((t * 0.6) % 2) - 1, 0)
    titleGrad.Offset = Vector2.new(((t * 0.35) % 2) - 1, 0)
    if pulse then
        dot.BackgroundTransparency = 0.2 + 0.5 * (0.5 + 0.5 * math.sin(t * 6))
    else
        dot.BackgroundTransparency = 0.05
    end
    refreshSend()
    if sendShown then
        sendStrokeGrad.Rotation = (t * 90) % 360
        if not sending then
            shineGrad.Offset = Vector2.new(math.clamp(((t * 0.9) % 2.6) - 1.3, -1, 1), 0)
            sendLbl.TextColor3 = C.ok:Lerp(C.white, 0.5 * (0.5 + 0.5 * math.sin(t * 5)))
        end
    end
    if notLibrary then
        local col = C.warn:Lerp(C.bad, (0.5 + 0.5 * math.sin(t * 4)) * 0.6)
        noticeLbl.TextColor3 = col
        noticeIcon.BackgroundColor3 = col
    end
end)

tween(win, 0.65, {Position = UDim2.new(0.5, 0, 0, HOME_Y)}, Enum.EasingStyle.Back)
tween(winScale, 0.55, {Scale = 1}, Enum.EasingStyle.Back)
for i = 1, 5 do
    task.delay(0.3 + i * 0.06, function()
        if closed then return end
        tween(digitScales[i], 0.45, {Scale = 1}, Enum.EasingStyle.Back)
    end)
    task.delay(0.55 + i * 0.06, function()
        if closed then return end
        tween(rowScales[i], 0.45, {Scale = 1}, Enum.EasingStyle.Back)
    end)
end

task.spawn(function()
    while gui.Parent and not closed do
        local ok, err = pcall(update)
        if not ok then setStatus("Error: " .. tostring(err), C.bad, false) end
        task.wait(REFRESH)
    end
end)
Executor compatibility changes over time. Check current reports before testing.

Copy the code above into a compatible Roblox script executor if you choose to test it.

DOORS Script Status

✓AvailabilityFree
$Price$0
◫CompatibilityDesktop & Mobile
★SafetyVerified

Roblox and game updates can affect compatibility, so the script’s status should be treated as temporary rather than guaranteed.

Frequently Asked Questions

What is a DOORS script?

A DOORS script is third-party Lua code intended to run alongside the Roblox game through a compatible script executor.

What features does this DOORS script include?

Different scripts contain different code. This version includes: Library Solver | OpenSource.

How do you use the DOORS script?

Pick a compatible executor such as Hydrogen, MacSploit, AWP.GG, Delta, Fluxus, Codex, launch Roblox and join the game, copy the complete Lua code from the script card above, paste it into the executor’s editor, and click Run or Execute. Compatibility changes over time, so a name here doesn’t guarantee current support.

Can a DOORS script get your Roblox account banned?

Yes. Third-party scripts can violate Roblox rules and may put an account at risk. Only use code from a source you trust, never enter your Roblox password into a script or executor, and test on an alternate account first.

Does the DOORS script work on mobile?

Check whether both the executor and the script support your device and the current Roblox version. Mobile executor support does not guarantee that every script will work.

Check out our Roblox Scripts hub and Roblox Games Directory for more.

Leave a Comment