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
-- 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)Copy the code above into a compatible Roblox script executor if you choose to test it.
DOORS Script Status
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.