-- Roblox Script: Hierarchy Explorer - MINIMAL WORKING VERSION -- No fancy UI, just pure functionality. Click folders to expand. Click scripts to copy. -- Uses simple text buttons with clear contrast. local screenGui = Instance.new("ScreenGui") screenGui.Name = "HierarchyViewer" screenGui.Parent = game.CoreGui screenGui.ResetOnSpawn = false local mainFrame = Instance.new("Frame") mainFrame.Size = UDim2.new(0, 500, 0, 600) mainFrame.Position = UDim2.new(0.5, -250, 0.5, -300) mainFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 30) mainFrame.BackgroundTransparency = 0 mainFrame.BorderSizePixel = 2 mainFrame.BorderColor3 = Color3.fromRGB(100, 150, 255) mainFrame.Parent = screenGui local title = Instance.new("TextLabel") title.Size = UDim2.new(1, 0, 0, 30) title.Position = UDim2.new(0, 0, 0, 0) title.BackgroundColor3 = Color3.fromRGB(40, 50, 80) title.Text = "HIERARCHY VIEWER - Click folder to expand, script to copy" title.TextColor3 = Color3.fromRGB(255, 255, 255) title.Font = Enum.Font.SourceSansBold title.TextSize = 14 title.Parent = mainFrame local closeBtn = Instance.new("TextButton") closeBtn.Size = UDim2.new(0, 40, 0, 30) closeBtn.Position = UDim2.new(1, -40, 0, 0) closeBtn.BackgroundColor3 = Color3.fromRGB(200, 40, 40) closeBtn.Text = "X" closeBtn.TextColor3 = Color3.fromRGB(255, 255, 255) closeBtn.Font = Enum.Font.SourceSansBold closeBtn.TextSize = 16 closeBtn.Parent = mainFrame closeBtn.MouseButton1Click:Connect(function() screenGui:Destroy() end) local scrollFrame = Instance.new("ScrollingFrame") scrollFrame.Size = UDim2.new(1, -10, 1, -40) scrollFrame.Position = UDim2.new(0, 5, 0, 35) scrollFrame.BackgroundColor3 = Color3.fromRGB(10, 10, 20) scrollFrame.BackgroundTransparency = 0 scrollFrame.BorderSizePixel = 1 scrollFrame.BorderColor3 = Color3.fromRGB(50, 50, 80) scrollFrame.CanvasSize = UDim2.new(0, 0, 0, 0) scrollFrame.ScrollBarThickness = 8 scrollFrame.Parent = mainFrame local copyBtn = Instance.new("TextButton") copyBtn.Size = UDim2.new(0, 120, 0, 28) copyBtn.Position = UDim2.new(0.5, -60, 0, 0) copyBtn.BackgroundColor3 = Color3.fromRGB(30, 100, 200) copyBtn.Text = "📋 COPY ALL" copyBtn.TextColor3 = Color3.fromRGB(255, 255, 255) copyBtn.Font = Enum.Font.SourceSansBold copyBtn.TextSize = 12 copyBtn.Visible = false copyBtn.Parent = title local statusLabel = Instance.new("TextLabel") statusLabel.Size = UDim2.new(0.5, 0, 0, 20) statusLabel.Position = UDim2.new(0.25, 0, 1, -22) statusLabel.BackgroundTransparency = 1 statusLabel.Text = "" statusLabel.TextColor3 = Color3.fromRGB(100, 255, 100) statusLabel.Font = Enum.Font.SourceSans statusLabel.TextSize = 12 statusLabel.TextXAlignment = Enum.TextXAlignment.Center statusLabel.Parent = mainFrame local rootNodes = {} local allButtons = {} local totalScripts = 0 local lineHeight = 24 -- COPY FUNCTION - SIMPLE local function copyText(text) local success = false -- Try all methods pcall(function() local c = Instance.new("Clipboard") c:SetText(text) c:Destroy() success = true end) if not success then pcall(function() game:GetService("UserInputService"):SetClipboard(text) success = true end) end if not success then pcall(function() setclipboard(text) success = true end) end if not success then pcall(function() toclipboard(text) success = true end) end -- Fallback: show in a textbox if not success then local box = Instance.new("TextBox") box.Size = UDim2.new(0, 480, 0, 300) box.Position = UDim2.new(0.5, -240, 0.5, -150) box.BackgroundColor3 = Color3.fromRGB(30, 30, 50) box.TextColor3 = Color3.fromRGB(255, 255, 255) box.Text = text box.MultiLine = true box.Font = Enum.Font.SourceSans box.TextSize = 11 box.Parent = screenGui box:CaptureFocus() box:SelectAll() statusLabel.Text = "📋 Text shown in box - press Ctrl+C" statusLabel.TextColor3 = Color3.fromRGB(255, 255, 100) task.delay(8, function() box:Destroy() end) return end statusLabel.Text = "✅ Copied!" statusLabel.TextColor3 = Color3.fromRGB(100, 255, 100) task.delay(2, function() statusLabel.Text = "" end) end -- Build tree local function buildTree(instance, depth, parentNode) depth = depth or 0 local nodes = {} local children = instance:GetChildren() for i = 1, #children do local child = children[i] local isScript = child:IsA("Script") or child:IsA("LocalScript") or child:IsA("ModuleScript") local hasScripts = false if not isScript then local function check(obj) for _, c in ipairs(obj:GetChildren()) do if c:IsA("Script") or c:IsA("LocalScript") or c:IsA("ModuleScript") then return true end if check(c) then return true end end return false end hasScripts = check(child) end if isScript or hasScripts then local node = { obj = child, depth = depth, parent = parentNode, children = {}, expanded = false, isScript = isScript, path = "game." .. child:GetFullName(), } local childNodes = buildTree(child, depth + 1, node) node.children = childNodes if isScript then totalScripts = totalScripts + 1 end table.insert(nodes, node) end if i % 200 == 0 then task.wait() end end return nodes end -- Get directory text local function getDirText(node, depth, lines) depth = depth or 0 lines = lines or {} local indent = string.rep(" ", depth) local icon = node.isScript and "[SCRIPT]" or "[FOLDER]" local parentName = node.parent and node.parent.obj.Name or "ROOT" local line = indent .. icon .. " " .. node.obj.Name .. " | Parent: " .. parentName .. " | Path: " .. node.path table.insert(lines, line) for _, child in ipairs(node.children) do getDirText(child, depth + 1, lines) end return lines end -- Render nodes local function renderNodes() for _, btn in ipairs(allButtons) do btn:Destroy() end allButtons = {} local yOff = 4 local filter = "" local function renderNode(node) local indent = string.rep(" ", node.depth) local icon = node.expanded and "▼ " or "▶ " local typeIcon = node.isScript and "📄 " or "📁 " local name = node.obj.Name if not node.isScript and #node.children > 0 then name = name .. " (" .. #node.children .. ")" end local text = indent .. icon .. typeIcon .. name local btn = Instance.new("TextButton") btn.Size = UDim2.new(1, -20, 0, lineHeight) btn.Position = UDim2.new(0, 10, 0, yOff) btn.BackgroundColor3 = node.isScript and Color3.fromRGB(50, 60, 120) or Color3.fromRGB(40, 40, 70) btn.TextColor3 = Color3.fromRGB(255, 255, 255) btn.Text = text btn.TextXAlignment = Enum.TextXAlignment.Left btn.TextSize = 13 btn.Font = Enum.Font.SourceSans btn.BorderSizePixel = 1 btn.BorderColor3 = Color3.fromRGB(80, 100, 180) btn.Parent = scrollFrame table.insert(allButtons, btn) btn.MouseButton1Click:Connect(function() if node.isScript then copyText(node.path) local old = btn.Text btn.Text = "✅ " .. node.path btn.TextColor3 = Color3.fromRGB(100, 255, 100) task.wait(1) btn.Text = old btn.TextColor3 = Color3.fromRGB(255, 255, 255) else node.expanded = not node.expanded renderNodes() end end) btn.TouchTap:Connect(function() if node.isScript then copyText(node.path) local old = btn.Text btn.Text = "✅ " .. node.path btn.TextColor3 = Color3.fromRGB(100, 255, 100) task.wait(1) btn.Text = old btn.TextColor3 = Color3.fromRGB(255, 255, 255) else node.expanded = not node.expanded renderNodes() end end) yOff = yOff + lineHeight if node.expanded then for _, child in ipairs(node.children) do renderNode(child) end end end for _, node in ipairs(rootNodes) do renderNode(node) end scrollFrame.CanvasSize = UDim2.new(0, 0, 0, yOff + 10) -- Update title with count title.Text = "HIERARCHY (" .. totalScripts .. " scripts) - Click folder to expand, script to copy" end -- Build everything local function buildEverything() rootNodes = {} allButtons = {} totalScripts = 0 local loadLabel = Instance.new("TextLabel") loadLabel.Size = UDim2.new(1, -20, 0, 30) loadLabel.Position = UDim2.new(0, 10, 0, 10) loadLabel.BackgroundTransparency = 1 loadLabel.Text = "Loading hierarchy..." loadLabel.TextColor3 = Color3.fromRGB(255, 255, 200) loadLabel.Font = Enum.Font.SourceSans loadLabel.TextSize = 14 loadLabel.Parent = scrollFrame task.wait(0.1) local success, err = pcall(function() local services = { game.Workspace, game.Players, game.Lighting, game.ReplicatedStorage, game.ServerScriptService, game.ServerStorage, game.StarterGui, game.StarterPack, game.StarterPlayer, game.ReplicatedFirst, game.SoundService, game.Teams, } for _, svc in ipairs(services) do if svc then local nodes = buildTree(svc, 0, nil) for _, n in ipairs(nodes) do table.insert(rootNodes, n) end end end end) loadLabel:Destroy() if not success then local errLabel = Instance.new("TextLabel") errLabel.Size = UDim2.new(1, -20, 0, 30) errLabel.Position = UDim2.new(0, 10, 0, 10) errLabel.BackgroundTransparency = 1 errLabel.Text = "Error: " .. tostring(err) errLabel.TextColor3 = Color3.fromRGB(255, 150, 150) errLabel.Font = Enum.Font.SourceSans errLabel.TextSize = 14 errLabel.Parent = scrollFrame return end -- Expand first level for _, node in ipairs(rootNodes) do node.expanded = true end renderNodes() end -- Copy ALL button local copyAllBtn = Instance.new("TextButton") copyAllBtn.Size = UDim2.new(0, 130, 0, 28) copyAllBtn.Position = UDim2.new(0.5, -65, 0, 0) copyAllBtn.BackgroundColor3 = Color3.fromRGB(30, 100, 200) copyAllBtn.Text = "📋 COPY ALL" copyAllBtn.TextColor3 = Color3.fromRGB(255, 255, 255) copyAllBtn.Font = Enum.Font.SourceSansBold copyAllBtn.TextSize = 12 copyAllBtn.BorderSizePixel = 0 copyAllBtn.Parent = title copyAllBtn.MouseButton1Click:Connect(function() local lines = {} table.insert(lines, "=== FULL HIERARCHY ===") table.insert(lines, "Scripts: " .. totalScripts) table.insert(lines, "") for _, node in ipairs(rootNodes) do local dirLines = getDirText(node, 0, {}) for _, l in ipairs(dirLines) do table.insert(lines, l) end table.insert(lines, "") end copyText(table.concat(lines, "\n")) end) -- Start buildEverything()