--// SADHUB Launcher — Roblox Executor Edition --// Author of prompt: KillerKC2 (4cheat) crocodile_428 (ответы mail.ru) local Players = game:GetService("Players") local TeleportService = game:GetService("TeleportService") local UserInputService = game:GetService("UserInputService") local HttpService = game:GetService("HttpService") local TweenService = game:GetService("TweenService") local CoreGui = game:GetService("CoreGui") local LP = Players.LocalPlayer --// Colors local BG = Color3.fromRGB(10, 10, 10) local SIDEBAR = Color3.fromRGB(12, 12, 12) local CARD = Color3.fromRGB(21, 21, 21) local CARD_HOVER = Color3.fromRGB(30, 30, 30) local BORDER = Color3.fromRGB(42, 42, 42) local BORDER_HOVER = Color3.fromRGB(58, 58, 58) local TEXT = Color3.fromRGB(255, 255, 255) local TEXT_DIM = Color3.fromRGB(154, 154, 154) local ACCENT = Color3.fromRGB(0, 120, 212) local ACCENT_HOVER = Color3.fromRGB(30, 138, 224) local DANGER = Color3.fromRGB(196, 43, 28) local GOLD = Color3.fromRGB(255, 215, 0) local GREEN = Color3.fromRGB(74, 222, 128) local CYAN = Color3.fromRGB(122, 211, 255) --// Games local GAMES = { {id = 1930863474, name = "Egg Cannon"}, {id = 1930866268, name = "winter place old"}, {id = 537413528, name = "build a boat"}, } --// Favorites local FAV_FILE = "sadhub_favs.json" local favorites = {} local function hasFileAPI() return type(writefile) == "function" and type(readfile) == "function" and type(isfile) == "function" end if hasFileAPI() then pcall(function() if isfile(FAV_FILE) then local data = HttpService:JSONDecode(readfile(FAV_FILE)) for _, v in ipairs(data) do favorites[v] = true end end end) end local function saveFavs() if not hasFileAPI() then return end local arr = {} for id in pairs(favorites) do table.insert(arr, id) end pcall(function() writefile(FAV_FILE, HttpService:JSONEncode(arr)) end) end --// Helpers local function corner(inst, r) local c = Instance.new("UICorner") c.CornerRadius = UDim.new(0, r or 8) c.Parent = inst return c end local function stroke(inst, color) local s = Instance.new("UIStroke") s.Color = color or BORDER s.Thickness = 1 s.Parent = inst return s end local function makeBtn(parent, o) local b = Instance.new("TextButton") b.Size = o.size b.Position = o.pos b.BackgroundColor3 = o.bg or CARD_HOVER b.BorderSizePixel = 0 b.Text = o.text or "" b.Font = o.font or Enum.Font.Gotham b.TextSize = o.ts or 12 b.TextColor3 = o.fg or TEXT b.AutoButtonColor = false b.ZIndex = 3 b.Parent = parent corner(b, o.radius or 6) if o.hover then b.MouseEnter:Connect(function() TweenService:Create(b, TweenInfo.new(0.12), {BackgroundColor3 = o.hover}):Play() end) b.MouseLeave:Connect(function() TweenService:Create(b, TweenInfo.new(0.12), {BackgroundColor3 = o.bg}):Play() end) end if o.click then b.MouseButton1Click:Connect(o.click) end return b end --// Forward decls local refresh local switch local currentTab = "games" --// ScreenGui local gui = Instance.new("ScreenGui") gui.Name = "SADHUB" gui.ResetOnSpawn = false gui.IgnoreGuiInset = true gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling pcall(function() gui.Parent = CoreGui end) if not gui.Parent then gui.Parent = LP:WaitForChild("PlayerGui") end --// Window local win = Instance.new("Frame") win.Size = UDim2.new(0, 460, 0, 540) win.Position = UDim2.new(0.5, -230, 0.5, -270) win.BackgroundColor3 = BG win.BorderSizePixel = 0 win.ClipsDescendants = true win.Visible = false win.Parent = gui corner(win, 10) stroke(win, BORDER) --// Title bar local titlebar = Instance.new("Frame") titlebar.Size = UDim2.new(1, 0, 0, 34) titlebar.BackgroundColor3 = SIDEBAR titlebar.BorderSizePixel = 0 titlebar.ZIndex = 2 titlebar.Parent = win corner(titlebar, 10) local fix = Instance.new("Frame") fix.Size = UDim2.new(1, 0, 0, 17) fix.Position = UDim2.new(0, 0, 1, -17) fix.BackgroundColor3 = SIDEBAR fix.BorderSizePixel = 0 fix.ZIndex = 2 fix.Parent = titlebar local logo = Instance.new("TextLabel") logo.Size = UDim2.new(0, 20, 1, 0) logo.Position = UDim2.new(0, 10, 0, 0) logo.BackgroundTransparency = 1 logo.Text = "◆" logo.Font = Enum.Font.GothamBold logo.TextSize = 16 logo.TextColor3 = ACCENT logo.ZIndex = 3 logo.Parent = titlebar local titleLbl = Instance.new("TextLabel") titleLbl.Size = UDim2.new(0, 220, 1, 0) titleLbl.Position = UDim2.new(0, 32, 0, 0) titleLbl.BackgroundTransparency = 1 titleLbl.Text = "SADHUB Launcher" titleLbl.Font = Enum.Font.Gotham titleLbl.TextSize = 12 titleLbl.TextColor3 = TEXT_DIM titleLbl.TextXAlignment = Enum.TextXAlignment.Left titleLbl.ZIndex = 3 titleLbl.Parent = titlebar local function winBtn(text, pos, hoverColor) local b = Instance.new("TextButton") b.Size = UDim2.new(0, 40, 1, 0) b.Position = pos b.BackgroundTransparency = 1 b.BorderSizePixel = 0 b.Text = text b.Font = Enum.Font.Gotham b.TextSize = 14 b.TextColor3 = TEXT b.ZIndex = 3 b.Parent = titlebar b.MouseEnter:Connect(function() b.BackgroundTransparency = 0 b.BackgroundColor3 = hoverColor end) b.MouseLeave:Connect(function() b.BackgroundTransparency = 1 end) return b end local closeBtn = winBtn("✕", UDim2.new(1, -40, 0, 0), DANGER) local minBtn = winBtn("─", UDim2.new(1, -80, 0, 0), Color3.fromRGB(50, 50, 50)) closeBtn.MouseButton1Click:Connect(function() gui.Enabled = false end) --// Drag local dragging, dragStart, startPos local function startDrag(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPos = win.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) end end titlebar.InputBegan:Connect(startDrag) titleLbl.InputBegan:Connect(startDrag) logo.InputBegan:Connect(startDrag) UserInputService.InputChanged:Connect(function(input) if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then local d = input.Position - dragStart win.Position = UDim2.new( startPos.X.Scale, startPos.X.Offset + d.X, startPos.Y.Scale, startPos.Y.Offset + d.Y ) end end) --// Body local body = Instance.new("Frame") body.Size = UDim2.new(1, 0, 1, -34) body.Position = UDim2.new(0, 0, 0, 34) body.BackgroundTransparency = 1 body.ZIndex = 2 body.Parent = win --// Minimize local minimized = false minBtn.MouseButton1Click:Connect(function() minimized = not minimized win.Size = minimized and UDim2.new(0, 460, 0, 34) or UDim2.new(0, 460, 0, 540) body.Visible = not minimized minBtn.Text = minimized and "□" or "─" end) --// Sidebar local sidebar = Instance.new("Frame") sidebar.Size = UDim2.new(0, 140, 1, 0) sidebar.BackgroundColor3 = SIDEBAR sidebar.BorderSizePixel = 0 sidebar.ZIndex = 3 sidebar.Parent = body corner(sidebar, 10) local navBtns = {} local function navBtn(key, text, y) local b = Instance.new("TextButton") b.Size = UDim2.new(1, -20, 0, 38) b.Position = UDim2.new(0, 10, 0, y) b.BackgroundColor3 = SIDEBAR b.BorderSizePixel = 0 b.Text = text b.Font = Enum.Font.Gotham b.TextSize = 13 b.TextColor3 = TEXT_DIM b.TextXAlignment = Enum.TextXAlignment.Left b.AutoButtonColor = false b.ZIndex = 4 b.Parent = sidebar corner(b, 6) local pad = Instance.new("UIPadding") pad.PaddingLeft = UDim.new(0, 12) pad.Parent = b b.MouseEnter:Connect(function() if currentTab ~= key then b.BackgroundColor3 = Color3.fromRGB(26, 26, 26) end end) b.MouseLeave:Connect(function() if currentTab ~= key then b.BackgroundColor3 = SIDEBAR end end) b.MouseButton1Click:Connect(function() switch(key) end) navBtns[key] = b end navBtn("games", "🎮 Игры", 16) navBtn("favs", "⭐ Избранное", 60) navBtn("settings", "⚙ Настройки", 104) --// Content local content = Instance.new("Frame") content.Size = UDim2.new(1, -140, 1, 0) content.Position = UDim2.new(0, 140, 0, 0) content.BackgroundTransparency = 1 content.ZIndex = 2 content.Parent = body local pageTitle = Instance.new("TextLabel") pageTitle.Size = UDim2.new(1, -30, 0, 30) pageTitle.Position = UDim2.new(0, 20, 0, 16) pageTitle.BackgroundTransparency = 1 pageTitle.Text = "Библиотека игр" pageTitle.Font = Enum.Font.GothamBold pageTitle.TextSize = 20 pageTitle.TextColor3 = TEXT pageTitle.TextXAlignment = Enum.TextXAlignment.Left pageTitle.ZIndex = 3 pageTitle.Parent = content local pageSub = Instance.new("TextLabel") pageSub.Size = UDim2.new(1, -30, 0, 18) pageSub.Position = UDim2.new(0, 20, 0, 48) pageSub.BackgroundTransparency = 1 pageSub.Text = "Запускай любимые миры в один клик" pageSub.Font = Enum.Font.Gotham pageSub.TextSize = 12 pageSub.TextColor3 = TEXT_DIM pageSub.TextXAlignment = Enum.TextXAlignment.Left pageSub.ZIndex = 3 pageSub.Parent = content local scroll = Instance.new("ScrollingFrame") scroll.Size = UDim2.new(1, -30, 1, -84) scroll.Position = UDim2.new(0, 20, 0, 76) scroll.BackgroundTransparency = 1 scroll.BorderSizePixel = 0 scroll.ScrollBarThickness = 4 scroll.ScrollBarImageColor3 = BORDER scroll.CanvasSize = UDim2.new(0, 0, 0, 0) scroll.ZIndex = 3 scroll.Parent = content local listLayout = Instance.new("UIListLayout") listLayout.Padding = UDim.new(0, 6) listLayout.SortOrder = Enum.SortOrder.LayoutOrder listLayout.Parent = scroll local status = Instance.new("TextLabel") status.Size = UDim2.new(1, -30, 0, 20) status.Position = UDim2.new(0, 20, 1, -24) status.BackgroundTransparency = 1 status.Text = "Готов к запуску" status.Font = Enum.Font.Gotham status.TextSize = 11 status.TextColor3 = TEXT_DIM status.TextXAlignment = Enum.TextXAlignment.Left status.ZIndex = 3 status.Parent = content local statusToken = 0 local function setStatus(text, color) statusToken = statusToken + 1 local tok = statusToken status.Text = text status.TextColor3 = color or TEXT_DIM task.delay(3, function() if tok == statusToken then status.Text = "Готов к запуску" status.TextColor3 = TEXT_DIM end end) end --// Card local function buildCard(game) local card = Instance.new("Frame") card.Size = UDim2.new(1, -8, 0, 60) card.BackgroundColor3 = CARD card.BorderSizePixel = 0 card.ZIndex = 4 card.Parent = scroll corner(card, 8) local st = stroke(card, BORDER) local nameL = Instance.new("TextLabel") nameL.Size = UDim2.new(0, 200, 0, 18) nameL.Position = UDim2.new(0, 14, 0, 10) nameL.BackgroundTransparency = 1 nameL.Text = game.name nameL.Font = Enum.Font.GothamBold nameL.TextSize = 13 nameL.TextColor3 = TEXT nameL.TextXAlignment = Enum.TextXAlignment.Left nameL.ZIndex = 5 nameL.Parent = card local idL = Instance.new("TextLabel") idL.Size = UDim2.new(0, 200, 0, 16) idL.Position = UDim2.new(0, 14, 0, 32) idL.BackgroundTransparency = 1 idL.Text = "ID: " .. game.id idL.Font = Enum.Font.Code idL.TextSize = 10 idL.TextColor3 = TEXT_DIM idL.TextXAlignment = Enum.TextXAlignment.Left idL.ZIndex = 5 idL.Parent = card makeBtn(card, { text = "▶ ИГРАТЬ", size = UDim2.new(0, 78, 0, 30), pos = UDim2.new(1, -90, 0.5, -15), bg = ACCENT, hover = ACCENT_HOVER, fg = TEXT, font = Enum.Font.GothamBold, ts = 11, click = function() setStatus("Запуск: " .. game.name, GREEN) local ok = pcall(function() TeleportService:Teleport(game.id, LP) end) if not ok then pcall(function() setclipboard("https://www.roblox.com/games/" .. game.id) end) setStatus("Ссылка скопирована", CYAN) end end, }) makeBtn(card, { text = "📋", size = UDim2.new(0, 30, 0, 30), pos = UDim2.new(1, -128, 0.5, -15), bg = CARD_HOVER, hover = Color3.fromRGB(40, 40, 40), fg = TEXT_DIM, click = function() pcall(function() setclipboard("https://www.roblox.com/games/" .. game.id) end) setStatus("Ссылка скопирована", CYAN) end, }) local fav = makeBtn(card, { text = favorites[game.id] and "★" or "☆", size = UDim2.new(0, 30, 0, 30), pos = UDim2.new(1, -164, 0.5, -15), bg = CARD_HOVER, hover = Color3.fromRGB(40, 40, 40), fg = favorites[game.id] and GOLD or TEXT_DIM, click = function() if favorites[game.id] then favorites[game.id] = nil setStatus("Убрано из избранного", TEXT_DIM) else favorites[game.id] = true setStatus("Добавлено в избранное", GOLD) end saveFavs() fav.Text = favorites[game.id] and "★" or "☆" fav.TextColor3 = favorites[game.id] and GOLD or TEXT_DIM refresh() end, }) card.MouseEnter:Connect(function() card.BackgroundColor3 = CARD_HOVER st.Color = BORDER_HOVER end) card.MouseLeave:Connect(function() card.BackgroundColor3 = CARD st.Color = BORDER end) end --// Refresh local function clearScroll() for _, c in ipairs(scroll:GetChildren()) do if c:IsA("Frame") or c:IsA("TextButton") or c:IsA("TextLabel") then c:Destroy() end end end refresh = function() clearScroll() local list if currentTab == "favs" then list = {} for _, g in ipairs(GAMES) do if favorites[g.id] then table.insert(list, g) end end if #list == 0 then local lbl = Instance.new("TextLabel") lbl.Size = UDim2.new(1, 0, 0, 40) lbl.BackgroundTransparency = 1 lbl.Text = "Пока пусто — добавь игру звёздочкой" lbl.Font = Enum.Font.Gotham lbl.TextSize = 12 lbl.TextColor3 = TEXT_DIM lbl.ZIndex = 4 lbl.Parent = scroll scroll.CanvasSize = UDim2.new(0, 0, 0, 40) return end else list = GAMES end for _, g in ipairs(list) do buildCard(g) end scroll.CanvasSize = UDim2.new(0, 0, 0, #list * 66) end --// Switch switch = function(key) currentTab = key for k, b in pairs(navBtns) do if k == key then b.TextColor3 = TEXT b.BackgroundColor3 = Color3.fromRGB(26, 26, 26) else b.TextColor3 = TEXT_DIM b.BackgroundColor3 = SIDEBAR end end if key == "games" then pageTitle.Text = "Библиотека игр" pageSub.Text = "Запускай любимые миры в один клик" refresh() elseif key == "favs" then pageTitle.Text = "Избранное" pageSub.Text = "Твои сохранённые игры" refresh() elseif key == "settings" then pageTitle.Text = "Настройки" pageSub.Text = "О программе" clearScroll() local info = Instance.new("TextLabel") info.Size = UDim2.new(1, -8, 0, 120) info.BackgroundColor3 = CARD info.BorderSizePixel = 0 info.Text = "SADHUB Launcher v1.0 · Beta\n\nАвтор промпта:\nKillerKC2 (4cheat) / crocodile_428\n\nПереключить GUI: RightShift" info.Font = Enum.Font.Gotham info.TextSize = 12 info.TextColor3 = TEXT_DIM info.TextWrapped = true info.ZIndex = 4 info.Parent = scroll corner(info, 8) stroke(info, BORDER) scroll.CanvasSize = UDim2.new(0, 0, 0, 120) end end --// Loading Screen local loading = Instance.new("Frame") loading.Size = UDim2.new(0, 460, 0, 540) loading.Position = UDim2.new(0.5, -230, 0.5, -270) loading.BackgroundColor3 = BG loading.BorderSizePixel = 0 loading.ZIndex = 10 loading.Parent = gui corner(loading, 10) local loadStroke = stroke(loading, BORDER) local loadText = Instance.new("TextLabel") loadText.Size = UDim2.new(1, 0, 1, 0) loadText.BackgroundTransparency = 1 loadText.Text = "Загрузка... 1" loadText.Font = Enum.Font.GothamBold loadText.TextSize = 24 loadText.TextColor3 = ACCENT loadText.ZIndex = 11 loadText.Parent = loading task.spawn(function() for i = 1, 5 do loadText.Text = "Загрузка... " .. i task.wait(1) end loadText.Text = "сделал https://scriptblox.com/u/nopls" loadText.Font = Enum.Font.Gotham loadText.TextSize = 16 loadText.TextColor3 = TEXT loadText.TextWrapped = true task.wait(2) -- Плавное исчезновение local info = TweenInfo.new(0.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out) TweenService:Create(loading, info, {BackgroundTransparency = 1}):Play() TweenService:Create(loadText, info, {TextTransparency = 1}):Play() TweenService:Create(loadStroke, info, {Transparency = 1}):Play() task.wait(0.5) loading:Destroy() win.Visible = true end) --// Toggle GUI UserInputService.InputBegan:Connect(function(input, gp) if gp then return end if input.KeyCode == Enum.KeyCode.RightShift then gui.Enabled = not gui.Enabled end end) switch("games")