local Players = game:GetService("Players") local player = Players.LocalPlayer -- BobloUI local BobloUI = loadstring(game:HttpGet( "https://raw.githubusercontent.com/bobloscript/BobloUI/main/dist/BobloUI.min.lua" ))() local UI = BobloUI:CreateWindow({ Id = "monochrome-key-helper", Title = "Monochrome Helper", Icon = "key-round", Theme = "Dark", FooterText = "BobloUI ยท Key Helper", }) local Main = UI:AddTab({ Id = "main", Title = "Main", Icon = "key-round", }) local Keys = Main:AddSection({ Title = "Key Setup", Icon = "key", Span = "Auto", Layout = "Stack", }) local CodeStatus = Keys:AddStatus({ Id = "CurrentCode", Title = "KeyCode", Value = "Unknown", Icon = "hash", }) local KeysStatus = Keys:AddStatus({ Id = "KeysStatus", Title = "Status", Value = "Ready", Icon = "activity", }) local CountStatus = Keys:AddStatus({ Id = "KeysCollected", Title = "Keys collected", Value = "0 / 4", Icon = "key-round", }) local running = false local RunButton local function notify(title, content, variant) UI.Notify:Push({ Title = title, Content = content, Variant = variant or "Info", Duration = 4, }) end local function getMonochrome() return workspace:FindFirstChild("monochrome") end local function getCurrentCode() local monochrome = getMonochrome() if not monochrome then return "Unknown" end local codeNote = monochrome:FindFirstChild("CodeNote") if not codeNote then return "Unknown" end local printed = codeNote:FindFirstChild("Printed") if not printed then return "Unknown" end local digits = printed:FindFirstChild("Digits") if not digits then return "Unknown" end local success, text = pcall(function() return digits.Text end) if success and text then return tostring(text) end return "Unknown" end local function refreshCode() local code = getCurrentCode() CodeStatus:SetValue(code) if code == "Unknown" then KeysStatus:SetValue("Code not found") else KeysStatus:SetValue("Code found") end return code end local function runFullSetup() if running then notify( "Already running", "Key collection is already in progress.", "Warning" ) return end running = true if RunButton then RunButton:SetLoading(true) end local root local startPos local success, err = xpcall(function() KeysStatus:SetValue("Getting character...") CountStatus:SetValue("0 / 4") local character = player.Character or player.CharacterAdded:Wait() root = character:WaitForChild("HumanoidRootPart") startPos = root.CFrame local monochrome = getMonochrome() if not monochrome then error("workspace.monochrome was not found") end -- Read current KeyCode local currentCode = getCurrentCode() CodeStatus:SetValue(currentCode) print("--- [Full Setup: Keys + BobloUI] ---") print("Current KeyCode identified: " .. currentCode) if type(fireproximityprompt) ~= "function" then error("fireproximityprompt is not supported by this executor") end local keysToFind = { "HiddenKey1", "HiddenKey2", "HiddenKey3", "HiddenKey4", } local collected = 0 for index, keyName in ipairs(keysToFind) do KeysStatus:SetValue( string.format("Collecting %s...", keyName) ) local keyModel = monochrome:FindFirstChild(keyName) if keyModel then local keyPart = keyModel:FindFirstChild("Key") if keyPart and keyPart:IsA("BasePart") then local prompt = keyPart:FindFirstChild( "KeyPrompt", true ) if prompt and prompt:IsA("ProximityPrompt") then root.CFrame = keyPart.CFrame task.wait(0.3) fireproximityprompt(prompt) collected += 1 CountStatus:SetValue( string.format( "%d / %d", collected, #keysToFind ) ) print("Collected: " .. keyName) task.wait(0.3) else warn("Prompt not found: " .. keyName) end else warn("Key part not found: " .. keyName) end else warn("Key model not found: " .. keyName) end end KeysStatus:SetValue("Returning...") end, debug.traceback) -- Always try to return to the original position if root and root.Parent and startPos then pcall(function() root.CFrame = startPos end) end running = false if RunButton then RunButton:SetLoading(false) end if success then KeysStatus:SetValue("Complete") notify( "Setup complete", "Keys collected. KeyCode: " .. getCurrentCode(), "Success" ) print("--- [Setup Complete] ---") else KeysStatus:SetValue("Error") notify( "Setup failed", tostring(err), "Error" ) warn("[Monochrome Helper]\n" .. tostring(err)) end end Keys:AddButton({ Title = "Read KeyCode", Description = "Read the current code from CodeNote.", Text = "Read", Icon = "scan-search", Callback = function() local code = refreshCode() if code ~= "Unknown" then notify( "KeyCode found", "Current code: " .. code, "Success" ) else notify( "KeyCode not found", "Could not find CodeNote.Printed.Digits.", "Warning" ) end end, }) RunButton = Keys:AddButton({ Title = "Grab all keys", Description = "Teleports to HiddenKey1-4, triggers each prompt and returns you back.", Text = "Run", Icon = "key-round", Callback = function() task.spawn(runFullSetup) end, }) -- Read code once when UI opens refreshCode()