-- 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)