--[[ Roblox Mod Menu v3 - 15 Features + Executor Fixed drag, minimize toggle, mobile compatible ]] -- Services local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local Lighting = game:GetService("Lighting") local VirtualUser = game:GetService("VirtualUser") local Workspace = game:GetService("Workspace") local StarterGui = game:GetService("StarterGui") local LocalPlayer = Players.LocalPlayer local PlayerGui = LocalPlayer:WaitForChild("PlayerGui") local Camera = Workspace.CurrentCamera local isMobile = UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled local viewportSize = Camera.ViewportSize -- ============================================================ -- CLEANUP OLD -- ============================================================ pcall(function() local old = PlayerGui:FindFirstChild("__ModMenu") if old then old:Destroy() end end) -- ============================================================ -- SCALE -- ============================================================ local function getScale() if isMobile then return math.clamp(math.min(viewportSize.X, viewportSize.Y) / 800, 0.65, 1.3) end return 1 end local scale = getScale() -- ============================================================ -- STATE -- ============================================================ local State = { minimized = false, menuX = 40, menuY = 60, dragging = false, dragOffset = Vector2.new(0, 0), activeTab = 1, toggles = {}, connections = {}, } -- ============================================================ -- THEME -- ============================================================ local Theme = { bg = Color3.fromRGB(18, 18, 24), header = Color3.fromRGB(28, 28, 40), accent = Color3.fromRGB(100, 70, 255), accentDim = Color3.fromRGB(65, 45, 180), text = Color3.fromRGB(225, 225, 235), textDim = Color3.fromRGB(130, 130, 150), toggleOff = Color3.fromRGB(50, 50, 68), toggleOn = Color3.fromRGB(100, 70, 255), tabActive = Color3.fromRGB(38, 38, 55), tabInactive = Color3.fromRGB(22, 22, 32), separator = Color3.fromRGB(45, 45, 60), danger = Color3.fromRGB(255, 60, 60), success = Color3.fromRGB(60, 220, 100), btnGreen = Color3.fromRGB(40, 160, 80), btnRed = Color3.fromRGB(170, 40, 40), inputBg = Color3.fromRGB(12, 12, 18), } -- ============================================================ -- DRAWING HELPERS -- ============================================================ local Drawings = {} local function D(class, props) local obj = Drawing.new(class) for k, v in pairs(props) do pcall(function() obj[k] = v end) end table.insert(Drawings, obj) return obj end -- ============================================================ -- LAYOUT -- ============================================================ local W = 420 * scale local HEADER_H = 38 * scale local TABBAR_H = 32 * scale local ITEM_H = 40 * scale local PAD = 10 * scale local TABS = {"Main", "Combat", "Visual", "Misc"} local TAB_COUNT = #TABS local TAB_W = math.floor(W / TAB_COUNT) local featureLayout = { { {"Speed Hack", "speedHack"}, {"Jump Power", "jumpPower"}, {"Fly", "fly"}, {"Noclip", "noclip"}, {"Infinite Jump", "infJump"}, {"Click Teleport", "clickTP"}, }, { {"Aimbot", "aimbot"}, {"Silent Aim", "silentAim"}, {"Reach (Melee)", "reach"}, {"Auto Clicker", "autoClicker"}, {"Hitbox Expander", "hitboxExp"}, }, { {"ESP Players", "esp"}, {"Fullbright", "fullbright"}, {"No Fog", "noFog"}, {"Chams", "chams"}, }, { {"Anti-AFK", "antiAFK"}, {"God Mode", "godMode"}, }, } local maxItems = 0 for _, items in ipairs(featureLayout) do if #items > maxItems then maxItems = #items end end local FEAT_AREA_Y = HEADER_H + TABBAR_H local FEAT_AREA_H = maxItems * ITEM_H -- Executor layout (Misc tab) local EXEC_GAP = 8 * scale local EXEC_LABEL_H = 18 * scale local EXEC_INPUT_H = 110 * scale local EXEC_BTN_H = 34 * scale local EXEC_AREA_H = EXEC_LABEL_H + EXEC_GAP + EXEC_INPUT_H + EXEC_GAP + EXEC_BTN_H + PAD local CONTENT_H = TABBAR_H + FEAT_AREA_H + EXEC_AREA_H local TOTAL_H = HEADER_H + CONTENT_H -- ============================================================ -- SCREENGUI (all interactive elements) -- ============================================================ local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "__ModMenu" ScreenGui.ResetOnSpawn = false ScreenGui.IgnoreGuiInset = true ScreenGui.DisplayOrder = 999 ScreenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling ScreenGui.Parent = PlayerGui -- ==================== HEADER FRAME (drag handle) ==================== local HeaderFrame = Instance.new("Frame") HeaderFrame.Name = "Header" HeaderFrame.Size = UDim2.new(0, W, 0, HEADER_H) HeaderFrame.Position = UDim2.new(0, State.menuX, 0, State.menuY) HeaderFrame.BackgroundColor3 = Theme.header HeaderFrame.BorderSizePixel = 0 HeaderFrame.ZIndex = 100 HeaderFrame.Parent = ScreenGui local HeaderCorner = Instance.new("UICorner") HeaderCorner.CornerRadius = UDim.new(0, 8 * scale) HeaderCorner.Parent = HeaderFrame -- Title local TitleLabel = Instance.new("TextLabel") TitleLabel.Name = "Title" TitleLabel.Size = UDim2.new(1, -100 * scale, 1, 0) TitleLabel.Position = UDim2.new(0, PAD, 0, 0) TitleLabel.BackgroundTransparency = 1 TitleLabel.Text = "★ MOD MENU" TitleLabel.TextColor3 = Theme.accent TitleLabel.TextSize = 16 * scale TitleLabel.Font = Enum.Font.GothamBold TitleLabel.TextXAlignment = Enum.TextXAlignment.Left TitleLabel.ZIndex = 101 TitleLabel.Parent = HeaderFrame -- Minimize hint local HintLabel = Instance.new("TextLabel") HintLabel.Name = "Hint" HintLabel.Size = UDim2.new(0, 100 * scale, 1, 0) HintLabel.Position = UDim2.new(1, -105 * scale, 0, 0) HintLabel.BackgroundTransparency = 1 HintLabel.Text = isMobile and "[ ⚙ ]" or "[ INSERT ]" HintLabel.TextColor3 = Theme.textDim HintLabel.TextSize = 12 * scale HintLabel.Font = Enum.Font.Gotham HintLabel.TextXAlignment = Enum.TextXAlignment.Right HintLabel.ZIndex = 101 HintLabel.Parent = HeaderFrame -- Accent line under header local HeaderLine = Instance.new("Frame") HeaderLine.Name = "Line" HeaderLine.Size = UDim2.new(1, 0, 0, 2) HeaderLine.Position = UDim2.new(0, 0, 1, -1) HeaderLine.BackgroundColor3 = Theme.accent HeaderLine.BorderSizePixel = 0 HeaderLine.ZIndex = 101 HeaderLine.Parent = HeaderFrame -- ==================== CONTENT CONTAINER ==================== local ContentFrame = Instance.new("Frame") ContentFrame.Name = "Content" ContentFrame.Size = UDim2.new(0, W, 0, CONTENT_H) ContentFrame.Position = UDim2.new(0, State.menuX, 0, State.menuY + HEADER_H) ContentFrame.BackgroundColor3 = Theme.bg ContentFrame.BorderSizePixel = 0 ContentFrame.ClipsDescendants = true ContentFrame.ZIndex = 99 ContentFrame.Parent = ScreenGui local ContentCorner = Instance.new("UICorner") ContentCorner.CornerRadius = UDim.new(0, 8 * scale) ContentCorner.Parent = ContentFrame -- ==================== TAB BAR ==================== local TabBar = Instance.new("Frame") TabBar.Name = "TabBar" TabBar.Size = UDim2.new(1, 0, 0, TABBAR_H) TabBar.BackgroundColor3 = Theme.tabInactive TabBar.BorderSizePixel = 0 TabBar.ZIndex = 100 TabBar.Parent = ContentFrame local TabLayout = Instance.new("UIListLayout") TabLayout.FillDirection = Enum.FillDirection.Horizontal TabLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center TabLayout.SortOrder = Enum.SortOrder.LayoutOrder TabLayout.Parent = TabBar local TabButtons = {} for i, tabName in ipairs(TABS) do local btn = Instance.new("TextButton") btn.Name = "Tab_" .. i btn.Size = UDim2.new(0, TAB_W, 1, 0) btn.BackgroundColor3 = (i == 1) and Theme.tabActive or Theme.tabInactive btn.BorderSizePixel = 0 btn.Text = tabName btn.TextColor3 = (i == 1) and Theme.accent or Theme.textDim btn.TextSize = 14 * scale btn.Font = Enum.Font.GothamSemibold btn.AutoButtonColor = false btn.LayoutOrder = i btn.ZIndex = 101 btn.Parent = TabBar local corner = Instance.new("UICorner") corner.CornerRadius = UDim.new(0, 6 * scale) corner.Parent = btn if i < TAB_COUNT then local sep = Instance.new("Frame") sep.Size = UDim2.new(0, 1, 0.6, 0) sep.Position = UDim2.new(1, -1, 0.2, 0) sep.BackgroundColor3 = Theme.separator sep.BorderSizePixel = 0 sep.ZIndex = 102 sep.Parent = btn end btn.MouseButton1Click:Connect(function() switchTab(i) end) TabButtons[i] = btn end -- ==================== FEATURE ROWS ==================== local featureElements = {} for tabIdx, features in ipairs(featureLayout) do featureElements[tabIdx] = {} for featIdx, feat in ipairs(features) do local rowY = FEAT_AREA_Y + (featIdx - 1) * ITEM_H -- Row button (interactive) local rowBtn = Instance.new("TextButton") rowBtn.Name = "Row_" .. feat[2] rowBtn.Size = UDim2.new(1, -PAD * 2, 0, ITEM_H - 2) rowBtn.Position = UDim2.new(0, PAD, 0, rowY) rowBtn.BackgroundColor3 = Theme.bg rowBtn.BackgroundTransparency = 1 rowBtn.BorderSizePixel = 0 rowBtn.Text = "" rowBtn.AutoButtonColor = false rowBtn.ZIndex = 102 rowBtn.Visible = (tabIdx == 1) rowBtn.Parent = ContentFrame -- Hover effect local hoverBg = Instance.new("Frame") hoverBg.Name = "Hover" hoverBg.Size = UDim2.new(1, 0, 1, 0) hoverBg.BackgroundColor3 = Theme.tabActive hoverBg.BackgroundTransparency = 1 hoverBg.BorderSizePixel = 0 hoverBg.ZIndex = -1 hoverBg.Parent = rowBtn local hoverCorner = Instance.new("UICorner") hoverCorner.CornerRadius = UDim.new(0, 6 * scale) hoverCorner.Parent = hoverBg -- Toggle indicator local indicator = Instance.new("Frame") indicator.Name = "Indicator" indicator.Size = UDim2.new(0, 14 * scale, 0, 14 * scale) indicator.Position = UDim2.new(0, PAD, 0.5, -7 * scale) indicator.BackgroundColor3 = Theme.toggleOff indicator.BorderSizePixel = 0 indicator.ZIndex = 103 indicator.Parent = rowBtn local indCorner = Instance.new("UICorner") indCorner.CornerRadius = UDim.new(1, 0) indCorner.Parent = indicator -- Feature name local nameLabel = Instance.new("TextLabel") nameLabel.Name = "Name" nameLabel.Size = UDim2.new(0.6, 0, 1, 0) nameLabel.Position = UDim2.new(0, PAD + 22 * scale, 0, 0) nameLabel.BackgroundTransparency = 1 nameLabel.Text = feat[1] nameLabel.TextColor3 = Theme.text nameLabel.TextSize = 14 * scale nameLabel.Font = Enum.Font.Gotham nameLabel.TextXAlignment = Enum.TextXAlignment.Left nameLabel.ZIndex = 103 nameLabel.Parent = rowBtn -- Status local statusLabel = Instance.new("TextLabel") statusLabel.Name = "Status" statusLabel.Size = UDim2.new(0, 40 * scale, 1, 0) statusLabel.Position = UDim2.new(1, -50 * scale, 0, 0) statusLabel.BackgroundTransparency = 1 statusLabel.Text = "OFF" statusLabel.TextColor3 = Theme.textDim statusLabel.TextSize = 13 * scale statusLabel.Font = Enum.Font.GothamSemibold statusLabel.TextXAlignment = Enum.TextXAlignment.Right statusLabel.ZIndex = 103 statusLabel.Parent = rowBtn -- Separator local sep = Instance.new("Frame") sep.Size = UDim2.new(1, -PAD, 0, 1) sep.Position = UDim2.new(0, PAD / 2, 1, -1) sep.BackgroundColor3 = Theme.separator sep.BackgroundTransparency = 0.6 sep.BorderSizePixel = 0 sep.ZIndex = 101 sep.Parent = rowBtn -- Click handler rowBtn.MouseButton1Click:Connect(function() toggleFeature(feat[2]) end) -- Hover handlers rowBtn.MouseEnter:Connect(function() hoverBg.BackgroundTransparency = 0.88 end) rowBtn.MouseLeave:Connect(function() hoverBg.BackgroundTransparency = 1 end) -- Touch feedback rowBtn.MouseButton1Down:Connect(function() hoverBg.BackgroundTransparency = 0.82 end) rowBtn.MouseButton1Up:Connect(function() task.delay(0.15, function() hoverBg.BackgroundTransparency = 1 end) end) local elem = { rowBtn = rowBtn, indicator = indicator, nameLabel = nameLabel, statusLabel = statusLabel, key = feat[2], label = feat[1], } table.insert(featureElements[tabIdx], elem) State.toggles[feat[2]] = false end end -- ==================== EXECUTOR (Misc tab) ==================== local execEnabled = false local ExecArea = Instance.new("Frame") ExecArea.Name = "Executor" ExecArea.Size = UDim2.new(1, -PAD * 2, 0, EXEC_AREA_H - PAD) ExecArea.Position = UDim2.new(0, PAD, 0, FEAT_AREA_Y + FEAT_AREA_H + PAD / 2) ExecArea.BackgroundColor3 = Theme.inputBg ExecArea.BorderSizePixel = 0 ExecArea.Visible = false ExecArea.ZIndex = 102 ExecArea.Parent = ContentFrame local ExecCorner = Instance.new("UICorner") ExecCorner.CornerRadius = UDim.new(0, 8 * scale) ExecCorner.Parent = ExecArea local ExecStroke = Instance.new("UIStroke") ExecStroke.Color = Theme.separator ExecStroke.Thickness = 1 ExecStroke.Parent = ExecArea -- Label local ExecLabel = Instance.new("TextLabel") ExecLabel.Size = UDim2.new(1, -PAD * 2, 0, EXEC_LABEL_H) ExecLabel.Position = UDim2.new(0, PAD, 0, 4 * scale) ExecLabel.BackgroundTransparency = 1 ExecLabel.Text = "⚡ Script Executor" ExecLabel.TextColor3 = Theme.accent ExecLabel.TextSize = 13 * scale ExecLabel.Font = Enum.Font.GothamBold ExecLabel.TextXAlignment = Enum.TextXAlignment.Left ExecLabel.ZIndex = 103 ExecLabel.Parent = ExecArea -- ScrollingFrame for code input local ExecScroll = Instance.new("ScrollingFrame") ExecScroll.Name = "CodeScroll" ExecScroll.Size = UDim2.new(1, -PAD * 2, 0, EXEC_INPUT_H) ExecScroll.Position = UDim2.new(0, PAD, 0, EXEC_LABEL_H + EXEC_GAP) ExecScroll.BackgroundColor3 = Color3.fromRGB(8, 8, 14) ExecScroll.BorderSizePixel = 0 ExecScroll.ScrollBarThickness = 4 * scale ExecScroll.ScrollBarImageColor3 = Theme.accentDim ExecScroll.CanvasSize = UDim2.new(0, 0, 0, 0) ExecScroll.AutomaticCanvasSize = Enum.AutomaticSize.Y ExecScroll.ZIndex = 103 ExecScroll.ClipsDescendants = true ExecScroll.Parent = ExecArea local ExecScrollCorner = Instance.new("UICorner") ExecScrollCorner.CornerRadius = UDim.new(0, 6 * scale) ExecScrollCorner.Parent = ExecScroll -- Code display label (inside ScrollingFrame) local CodeLabel = Instance.new("TextLabel") CodeLabel.Name = "CodeText" CodeLabel.Size = UDim2.new(1, -PAD, 1, 0) CodeLabel.Position = UDim2.new(0, PAD / 2, 0, 0) CodeLabel.BackgroundTransparency = 1 CodeLabel.Text = "-- Paste script here...\n-- Tap Execute to run" CodeLabel.TextColor3 = Theme.textDim CodeLabel.TextSize = 13 * scale CodeLabel.Font = Enum.Font.Code CodeLabel.TextXAlignment = Enum.TextXAlignment.Left CodeLabel.TextYAlignment = Enum.TextYAlignment.Top CodeLabel.TextWrapped = true CodeLabel.ZIndex = 104 CodeLabel.Parent = ExecScroll -- Actual TextBox (overlaid, invisible text, for input capture) local ExecTextBox = Instance.new("TextBox") ExecTextBox.Name = "CodeInput" ExecTextBox.Size = UDim2.new(1, 0, 1, 0) ExecTextBox.Position = UDim2.new(0, 0, 0, 0) ExecTextBox.BackgroundTransparency = 1 ExecTextBox.TextColor3 = Color3.new(0, 0, 0) -- invisible text ExecTextBox.TextTransparency = 1 ExecTextBox.TextSize = 13 * scale ExecTextBox.Font = Enum.Font.Code ExecTextBox.TextXAlignment = Enum.TextXAlignment.Left ExecTextBox.TextYAlignment = Enum.TextYAlignment.Top ExecTextBox.TextWrapped = true ExecTextBox.MultiLine = true ExecTextBox.ClearTextOnFocus = false ExecTextBox.PlaceholderText = "" ExecTextBox.ZIndex = 105 ExecTextBox.Parent = ExecScroll -- Stored script text local scriptText = "-- Paste script here\n-- Tap Execute to run" ExecTextBox.Focused:Connect(function() if CodeLabel.TextColor3 == Theme.textDim then ExecTextBox.Text = "" CodeLabel.Text = "" else ExecTextBox.Text = scriptText end end) ExecTextBox.FocusLost:Connect(function() scriptText = ExecTextBox.Text CodeLabel.Text = scriptText if scriptText == "" then CodeLabel.Text = "-- Paste script here\n-- Tap Execute to run" CodeLabel.TextColor3 = Theme.textDim else CodeLabel.TextColor3 = Theme.text end end) ExecTextBox:GetPropertyChangedSignal("Text"):Connect(function() scriptText = ExecTextBox.Text CodeLabel.Text = scriptText if scriptText ~= "" then CodeLabel.TextColor3 = Theme.text end end) -- Button row local BtnRow = Instance.new("Frame") BtnRow.Size = UDim2.new(1, -PAD * 2, 0, EXEC_BTN_H) BtnRow.Position = UDim2.new(0, PAD, 0, EXEC_LABEL_H + EXEC_GAP + EXEC_INPUT_H + EXEC_GAP) BtnRow.BackgroundTransparency = 1 BtnRow.ZIndex = 103 BtnRow.Parent = ExecArea local BtnLayout = Instance.new("UIListLayout") BtnLayout.FillDirection = Enum.FillDirection.Horizontal BtnLayout.HorizontalAlignment = Enum.HorizontalAlignment.Left BtnLayout.Padding = UDim.new(0, 8 * scale) BtnLayout.Parent = BtnRow -- Execute button local ExecBtn = Instance.new("TextButton") ExecBtn.Name = "Execute" ExecBtn.Size = UDim2.new(0.48, 0, 1, 0) ExecBtn.BackgroundColor3 = Theme.btnGreen ExecBtn.BorderSizePixel = 0 ExecBtn.Text = "▶ Execute" ExecBtn.TextColor3 = Color3.new(1, 1, 1) ExecBtn.TextSize = 14 * scale ExecBtn.Font = Enum.Font.GothamBold ExecBtn.AutoButtonColor = true ExecBtn.LayoutOrder = 1 ExecBtn.ZIndex = 104 ExecBtn.Parent = BtnRow local ExecBtnCorner = Instance.new("UICorner") ExecBtnCorner.CornerRadius = UDim.new(0, 6 * scale) ExecBtnCorner.Parent = ExecBtn -- Clear button local ClearBtn = Instance.new("TextButton") ClearBtn.Name = "Clear" ClearBtn.Size = UDim2.new(0.48, 0, 1, 0) ClearBtn.BackgroundColor3 = Theme.btnRed ClearBtn.BorderSizePixel = 0 ClearBtn.Text = "✕ Clear" ClearBtn.TextColor3 = Color3.new(1, 1, 1) ClearBtn.TextSize = 14 * scale ClearBtn.Font = Enum.Font.GothamBold ClearBtn.AutoButtonColor = true ClearBtn.LayoutOrder = 2 ClearBtn.ZIndex = 104 ClearBtn.Parent = BtnRow local ClearBtnCorner = Instance.new("UICorner") ClearBtnCorner.CornerRadius = UDim.new(0, 6 * scale) ClearBtnCorner.Parent = ClearBtn -- Paste button (mobile-friendly) local PasteBtn = Instance.new("TextButton") PasteBtn.Name = "Paste" PasteBtn.Size = UDim2.new(0, 60 * scale, 1, 0) PasteBtn.BackgroundColor3 = Theme.accentDim PasteBtn.BorderSizePixel = 0 PasteBtn.Text = "📋" PasteBtn.TextColor3 = Color3.new(1, 1, 1) PasteBtn.TextSize = 16 * scale PasteBtn.Font = Enum.Font.GothamBold PasteBtn.AutoButtonColor = true PasteBtn.LayoutOrder = 3 PasteBtn.ZIndex = 104 PasteBtn.Parent = BtnRow local PasteBtnCorner = Instance.new("UICorner") PasteBtnCorner.CornerRadius = UDim.new(0, 6 * scale) PasteBtnCorner.Parent = PasteBtn -- Execute function local function executeScript() local code = scriptText if code == "" or code:find("Paste script") then return end ExecBtn.Text = "⏳ Running..." ExecBtn.BackgroundColor3 = Color3.fromRGB(120, 100, 40) task.spawn(function() local success, err = pcall(function() local fn, compileErr = loadstring(code) if fn then fn() else error(compileErr) end end) if success then ExecBtn.Text = "✓ Done" ExecBtn.BackgroundColor3 = Theme.btnGreen else ExecBtn.Text = "✕ Error" ExecBtn.BackgroundColor3 = Theme.danger warn("[Executor Error]: " .. tostring(err)) end task.delay(1.5, function() ExecBtn.Text = "▶ Execute" ExecBtn.BackgroundColor3 = Theme.btnGreen end) end) end local function clearScript() scriptText = "" ExecTextBox.Text = "" CodeLabel.Text = "-- Paste script here\n-- Tap Execute to run" CodeLabel.TextColor3 = Theme.textDim end local function pasteScript() pcall(function() local clip = getclipboard() if clip and clip ~= "" then scriptText = clip ExecTextBox.Text = clip CodeLabel.Text = clip CodeLabel.TextColor3 = Theme.text end end) end ExecBtn.MouseButton1Click:Connect(executeScript) ClearBtn.MouseButton1Click:Connect(clearScript) PasteBtn.MouseButton1Click:Connect(pasteScript) -- Executor toggle in Misc tab (replaces Server Lag) local function enableExecutor() execEnabled = true ExecArea.Visible = true end local function disableExecutor() execEnabled = false ExecArea.Visible = false -- Unfocus textbox pcall(function() ExecTextBox:ReleaseFocus() end) end -- Create executor toggle row in Misc tab do local tabIdx = 4 -- Misc tab local featIdx = #featureLayout[tabIdx] + 1 local rowY = FEAT_AREA_Y + (featIdx - 1) * ITEM_H local rowBtn = Instance.new("TextButton") rowBtn.Name = "Row_executor" rowBtn.Size = UDim2.new(1, -PAD * 2, 0, ITEM_H - 2) rowBtn.Position = UDim2.new(0, PAD, 0, rowY) rowBtn.BackgroundColor3 = Theme.bg rowBtn.BackgroundTransparency = 1 rowBtn.BorderSizePixel = 0 rowBtn.Text = "" rowBtn.AutoButtonColor = false rowBtn.ZIndex = 102 rowBtn.Visible = false rowBtn.Parent = ContentFrame local hoverBg = Instance.new("Frame") hoverBg.Size = UDim2.new(1, 0, 1, 0) hoverBg.BackgroundColor3 = Theme.tabActive hoverBg.BackgroundTransparency = 1 hoverBg.BorderSizePixel = 0 hoverBg.ZIndex = -1 hoverBg.Parent = rowBtn local hc = Instance.new("UICorner") hc.CornerRadius = UDim.new(0, 6 * scale) hc.Parent = hoverBg local indicator = Instance.new("Frame") indicator.Size = UDim2.new(0, 14 * scale, 0, 14 * scale) indicator.Position = UDim2.new(0, PAD, 0.5, -7 * scale) indicator.BackgroundColor3 = Theme.toggleOff indicator.BorderSizePixel = 0 indicator.ZIndex = 103 indicator.Parent = rowBtn local ic = Instance.new("UICorner") ic.CornerRadius = UDim.new(1, 0) ic.Parent = indicator local nameLabel = Instance.new("TextLabel") nameLabel.Size = UDim2.new(0.6, 0, 1, 0) nameLabel.Position = UDim2.new(0, PAD + 22 * scale, 0, 0) nameLabel.BackgroundTransparency = 1 nameLabel.Text = "Script Executor" nameLabel.TextColor3 = Theme.text nameLabel.TextSize = 14 * scale nameLabel.Font = Enum.Font.Gotham nameLabel.TextXAlignment = Enum.TextXAlignment.Left nameLabel.ZIndex = 103 nameLabel.Parent = rowBtn local statusLabel = Instance.new("TextLabel") statusLabel.Size = UDim2.new(0, 40 * scale, 1, 0) statusLabel.Position = UDim2.new(1, -50 * scale, 0, 0) statusLabel.BackgroundTransparency = 1 statusLabel.Text = "OFF" statusLabel.TextColor3 = Theme.textDim statusLabel.TextSize = 13 * scale statusLabel.Font = Enum.Font.GothamSemibold statusLabel.TextXAlignment = Enum.TextXAlignment.Right statusLabel.ZIndex = 103 statusLabel.Parent = rowBtn local sep = Instance.new("Frame") sep.Size = UDim2.new(1, -PAD, 0, 1) sep.Position = UDim2.new(0, PAD / 2, 1, -1) sep.BackgroundColor3 = Theme.separator sep.BackgroundTransparency = 0.6 sep.BorderSizePixel = 0 sep.ZIndex = 101 sep.Parent = rowBtn rowBtn.MouseButton1Click:Connect(function() execEnabled = not execEnabled if execEnabled then enableExecutor() indicator.BackgroundColor3 = Theme.toggleOn statusLabel.Text = "ON" statusLabel.TextColor3 = Theme.success nameLabel.TextColor3 = Theme.accent else disableExecutor() indicator.BackgroundColor3 = Theme.toggleOff statusLabel.Text = "OFF" statusLabel.TextColor3 = Theme.textDim nameLabel.TextColor3 = Theme.text end end) rowBtn.MouseEnter:Connect(function() hoverBg.BackgroundTransparency = 0.88 end) rowBtn.MouseLeave:Connect(function() hoverBg.BackgroundTransparency = 1 end) rowBtn.MouseButton1Down:Connect(function() hoverBg.BackgroundTransparency = 0.82 end) rowBtn.MouseButton1Up:Connect(function() task.delay(0.15, function() hoverBg.BackgroundTransparency = 1 end) end) table.insert(featureElements[tabIdx], { rowBtn = rowBtn, indicator = indicator, nameLabel = nameLabel, statusLabel = statusLabel, key = "executor", label = "Script Executor", }) State.toggles["executor"] = false end -- ==================== TOGGLE BUTTON ==================== local ToggleBtn = Instance.new("TextButton") ToggleBtn.Name = "Toggle" ToggleBtn.Size = UDim2.new(0, 50 * scale, 0, 50 * scale) ToggleBtn.Position = UDim2.new(0, 14, 0, 14) ToggleBtn.BackgroundColor3 = Color3.fromRGB(30, 30, 48) ToggleBtn.BorderSizePixel = 0 ToggleBtn.Text = "⚙" ToggleBtn.TextColor3 = Theme.accent ToggleBtn.TextSize = 24 * scale ToggleBtn.Font = Enum.Font.GothamBold ToggleBtn.AutoButtonColor = true ToggleBtn.ZIndex = 999 ToggleBtn.Parent = ScreenGui local ToggleCorner = Instance.new("UICorner") ToggleCorner.CornerRadius = UDim.new(0, 14 * scale) ToggleCorner.Parent = ToggleBtn local ToggleStroke = Instance.new("UIStroke") ToggleStroke.Color = Theme.accent ToggleStroke.Thickness = 2 ToggleStroke.Parent = ToggleBtn -- ============================================================ -- VISIBILITY / MINIMIZE -- ============================================================ local function setMinimized(min) State.minimized = min ContentFrame.Visible = not min if min then ToggleBtn.Text = "▶" -- Unfocus any textboxes pcall(function() ExecTextBox:ReleaseFocus() end) else ToggleBtn.Text = "⚙" end end -- ============================================================ -- TAB SWITCHING -- ============================================================ function switchTab(idx) State.activeTab = idx for i, btn in ipairs(TabButtons) do btn.BackgroundColor3 = (i == idx) and Theme.tabActive or Theme.tabInactive btn.TextColor3 = (i == idx) and Theme.accent or Theme.textDim end for tabIdx, elems in ipairs(featureElements) do local show = (tabIdx == idx) for _, e in ipairs(elems) do e.rowBtn.Visible = show end end -- Show executor area only on Misc tab if idx == 4 and execEnabled then ExecArea.Visible = true else ExecArea.Visible = false end -- Unfocus textboxes on tab switch pcall(function() ExecTextBox:ReleaseFocus() end) end -- ============================================================ -- TOGGLE FEATURE -- ============================================================ local function setToggleVisual(key, val) for _, elems in ipairs(featureElements) do for _, e in ipairs(elems) do if e.key == key then e.indicator.BackgroundColor3 = val and Theme.toggleOn or Theme.toggleOff e.statusLabel.Text = val and "ON" or "OFF" e.statusLabel.TextColor3 = val and Theme.success or Theme.textDim e.nameLabel.TextColor3 = val and Theme.accent or Theme.text break end end end end function toggleFeature(key) if key == "executor" then return end -- handled separately local val = not State.toggles[key] State.toggles[key] = val setToggleVisual(key, val) applyToggle(key) end -- ============================================================ -- CONNECTION HELPERS -- ============================================================ local function addConn(key, conn) if not State.connections[key] then State.connections[key] = {} end table.insert(State.connections[key], conn) end local function clearConns(key) if State.connections[key] then for _, c in ipairs(State.connections[key]) do pcall(function() if typeof(c) == "RBXScriptConnection" and c.Connected then c:Disconnect() elseif typeof(c) == "table" and c.Disconnect then c:Disconnect() end end) end State.connections[key] = {} end end -- ============================================================ -- 14 FEATURES + EXECUTOR -- ============================================================ -- 1. SPEED HACK local function enableSpeed() pcall(function() local hum = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid") if hum then hum.WalkSpeed = 100 end end) addConn("speedHack", LocalPlayer.CharacterAdded:Connect(function(c) task.wait(0.5) local h = c:FindFirstChildOfClass("Humanoid") if h and State.toggles.speedHack then h.WalkSpeed = 100 end end)) end local function disableSpeed() clearConns("speedHack") pcall(function() local hum = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid") if hum then hum.WalkSpeed = 16 end end) end -- 2. JUMP POWER local function enableJumpPower() pcall(function() local hum = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid") if hum then hum.JumpPower = 200 end end) addConn("jumpPower", LocalPlayer.CharacterAdded:Connect(function(c) task.wait(0.5) local h = c:FindFirstChildOfClass("Humanoid") if h and State.toggles.jumpPower then h.JumpPower = 200 end end)) end local function disableJumpPower() clearConns("jumpPower") pcall(function() local hum = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid") if hum then hum.JumpPower = 50 end end) end -- 3. FLY local flyBV, flyBG local flyKeys = {fwd = false, back = false, left = false, right = false, up = false, down = false} local keyMap = { [Enum.KeyCode.W] = "fwd", [Enum.KeyCode.S] = "back", [Enum.KeyCode.A] = "left", [Enum.KeyCode.D] = "right", [Enum.KeyCode.Space] = "up", [Enum.KeyCode.LeftControl] = "down", } UserInputService.InputBegan:Connect(function(inp, gpe) if gpe then return end local k = keyMap[inp.KeyCode]; if k then flyKeys[k] = true end end) UserInputService.InputEnded:Connect(function(inp) local k = keyMap[inp.KeyCode]; if k then flyKeys[k] = false end end) local function enableFly() local char = LocalPlayer.Character if not char then return end local hrp = char:FindFirstChild("HumanoidRootPart") if not hrp then return end flyBV = Instance.new("BodyVelocity") flyBV.MaxForce = Vector3.new(math.huge, math.huge, math.huge) flyBV.Velocity = Vector3.zero flyBV.Parent = hrp flyBG = Instance.new("BodyGyro") flyBG.MaxTorque = Vector3.new(math.huge, math.huge, math.huge) flyBG.P = 9000 flyBG.Parent = hrp addConn("fly", RunService.RenderStepped:Connect(function() if not State.toggles.fly then return end local root = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") if not root or not flyBV then return end local cam = Workspace.CurrentCamera local dir = Vector3.zero local spd = 80 if flyKeys.fwd then dir = dir + cam.CFrame.LookVector end if flyKeys.back then dir = dir - cam.CFrame.LookVector end if flyKeys.left then dir = dir - cam.CFrame.RightVector end if flyKeys.right then dir = dir + cam.CFrame.RightVector end if flyKeys.up then dir = dir + Vector3.new(0, 1, 0) end if flyKeys.down then dir = dir - Vector3.new(0, 1, 0) end if dir.Magnitude > 0 then dir = dir.Unit end flyBV.Velocity = dir * spd flyBG.CFrame = cam.CFrame end)) end local function disableFly() clearConns("fly") pcall(function() if flyBV then flyBV:Destroy() flyBV = nil end end) pcall(function() if flyBG then flyBG:Destroy() flyBG = nil end end) end -- 4. NOCLIP local function enableNoclip() addConn("noclip", RunService.Stepped:Connect(function() if not State.toggles.noclip then return end local char = LocalPlayer.Character if char then for _, p in ipairs(char:GetDescendants()) do if p:IsA("BasePart") then p.CanCollide = false end end end end)) end local function disableNoclip() clearConns("noclip") pcall(function() local char = LocalPlayer.Character if char then for _, p in ipairs(char:GetDescendants()) do if p:IsA("BasePart") and p.Name ~= "HumanoidRootPart" then p.CanCollide = true end end end end) end -- 5. INFINITE JUMP local function enableInfJump() addConn("infJump", UserInputService.JumpRequest:Connect(function() if not State.toggles.infJump then return end local char = LocalPlayer.Character if char then local hum = char:FindFirstChildOfClass("Humanoid") if hum then hum:ChangeState(Enum.HumanoidStateType.Jumping) end end end)) end local function disableInfJump() clearConns("infJump") end -- 6. CLICK TELEPORT local function enableClickTP() addConn("clickTP", UserInputService.InputBegan:Connect(function(input, gpe) if gpe or not State.toggles.clickTP then return end if input.UserInputType ~= Enum.UserInputType.MouseButton1 and input.UserInputType ~= Enum.UserInputType.Touch then return end local char = LocalPlayer.Character if not char or not char:FindFirstChild("HumanoidRootPart") then return end local pos = input.Position local guiAtPos = PlayerGui:GetGuiObjectsAtPosition(pos.X, pos.Y) for _, obj in ipairs(guiAtPos) do if obj:IsDescendantOf(ScreenGui) then return end end local ray = Camera:ScreenPointToRay(pos.X, pos.Y) local params = RaycastParams.new() params.FilterDescendantsInstances = {char} params.FilterType = Enum.RaycastFilterType.Exclude local result = Workspace:Raycast(ray.Origin, ray.Direction * 1000, params) if result then char.HumanoidRootPart.CFrame = CFrame.new(result.Position + Vector3.new(0, 3, 0)) end end)) end local function disableClickTP() clearConns("clickTP") end -- 7. AIMBOT local function getClosestPlayer() local closest, dist = nil, math.huge local myChar = LocalPlayer.Character if not myChar or not myChar:FindFirstChild("Head") then return nil end for _, plr in ipairs(Players:GetPlayers()) do if plr ~= LocalPlayer and plr.Character and plr.Character:FindFirstChild("Head") then local hum = plr.Character:FindFirstChildOfClass("Humanoid") if hum and hum.Health > 0 then local head = plr.Character.Head local sp, onScreen = Camera:WorldToScreenPoint(head.Position) if onScreen then local mag = (Vector2.new(sp.X, sp.Y) - UserInputService:GetMouseLocation()).Magnitude if mag < dist and mag < 400 then dist = mag closest = plr end end end end end return closest end local function enableAimbot() addConn("aimbot", RunService.RenderStepped:Connect(function() if not State.toggles.aimbot then return end local t = getClosestPlayer() if t and t.Character and t.Character:FindFirstChild("Head") then Camera.CFrame = CFrame.new(Camera.CFrame.Position, t.Character.Head.Position) end end)) end local function disableAimbot() clearConns("aimbot") end -- 8. SILENT AIM local oldNamecall local function enableSilentAim() oldNamecall = hookmetamethod(game, "__namecall", newcclosure(function(self, ...) local method = getnamecallmethod() if State.toggles.silentAim and method == "Raycast" then local args = {...} local t = getClosestPlayer() if t and t.Character and t.Character:FindFirstChild("Head") then local head = t.Character.Head local origin = args[1] or Camera.CFrame.Position if #args >= 2 then args[2] = (head.Position - origin) end return oldNamecall(self, unpack(args)) end end return oldNamecall(self, ...) end)) end local function disableSilentAim() if oldNamecall then pcall(function() hookmetamethod(game, "__namecall", oldNamecall); oldNamecall = nil end) end end -- 9. REACH local reachVal = 25 local function enableReach() addConn("reach", RunService.RenderStepped:Connect(function() if not State.toggles.reach then return end local char = LocalPlayer.Character; if not char then return end local tool = char:FindFirstChildOfClass("Tool") if tool then local h = tool:FindFirstChild("Handle") if h then pcall(function() h.Size = Vector3.new(reachVal, reachVal, reachVal) end) end end end)) end local function disableReach() clearConns("reach") end -- 10. AUTO CLICKER local function enableAutoClicker() addConn("autoClicker", RunService.RenderStepped:Connect(function() if not State.toggles.autoClicker then return end pcall(function() mouse1press(); mouse1release() end) end)) end local function disableAutoClicker() clearConns("autoClicker") end -- 11. HITBOX EXPANDER local hitboxSize = 15 local origSizes = {} local function enableHitboxExp() origSizes = {} addConn("hitboxExp", RunService.RenderStepped:Connect(function() if not State.toggles.hitboxExp then return end for _, plr in ipairs(Players:GetPlayers()) do if plr ~= LocalPlayer and plr.Character then local hrp = plr.Character:FindFirstChild("HumanoidRootPart") if hrp then if not origSizes[plr.UserId] then origSizes[plr.UserId] = hrp.Size end hrp.Size = Vector3.new(hitboxSize, hitboxSize, hitboxSize) hrp.Transparency = 0.7 hrp.CanCollide = false end end end end)) end local function disableHitboxExp() clearConns("hitboxExp") for _, plr in ipairs(Players:GetPlayers()) do pcall(function() if plr.Character then local hrp = plr.Character:FindFirstChild("HumanoidRootPart") if hrp and origSizes[plr.UserId] then hrp.Size = origSizes[plr.UserId]; hrp.Transparency = 1 end end end) end origSizes = {} end -- 12. ESP PLAYERS local espDrawings = {} local function createESP(plr) if espDrawings[plr.UserId] then return end local d = {} d.box = Drawing.new("Square") d.box.Filled = false; d.box.Color = Theme.accent; d.box.Thickness = 1.5 d.box.Transparency = 0.9; d.box.Visible = false; d.box.ZIndex = 5 d.name = Drawing.new("Text") d.name.Text = plr.Name; d.name.Size = math.floor(13 * scale); d.name.Center = true d.name.Outline = true; d.name.OutlineColor = Color3.new(0, 0, 0) d.name.Color = Color3.new(1, 1, 1); d.name.Font = 2 d.name.Transparency = 1; d.name.Visible = false; d.name.ZIndex = 5 d.hpBar = Drawing.new("Square") d.hpBar.Filled = true; d.hpBar.Color = Theme.success d.hpBar.Transparency = 0.8; d.hpBar.Visible = false; d.hpBar.ZIndex = 5 d.dist = Drawing.new("Text") d.dist.Text = "0m"; d.dist.Size = math.floor(11 * scale); d.dist.Center = true d.dist.Outline = true; d.dist.OutlineColor = Color3.new(0, 0, 0) d.dist.Color = Theme.textDim; d.dist.Font = 2 d.dist.Transparency = 1; d.dist.Visible = false; d.dist.ZIndex = 5 espDrawings[plr.UserId] = d end local function removeESP(plr) local d = espDrawings[plr.UserId] if d then for _, obj in pairs(d) do pcall(function() obj:Remove() end) end end espDrawings[plr.UserId] = nil end local function enableESP() for _, p in ipairs(Players:GetPlayers()) do if p ~= LocalPlayer then createESP(p) end end addConn("espAdd", Players.PlayerAdded:Connect(function(p) if p ~= LocalPlayer then createESP(p) end end)) addConn("espRem", Players.PlayerRemoving:Connect(removeESP)) addConn("espUpd", RunService.RenderStepped:Connect(function() if not State.toggles.esp then return end for _, plr in ipairs(Players:GetPlayers()) do if plr ~= LocalPlayer then local d = espDrawings[plr.UserId] if d and plr.Character and plr.Character:FindFirstChild("HumanoidRootPart") and plr.Character:FindFirstChild("Humanoid") then local hrp = plr.Character.HumanoidRootPart local hum = plr.Character.Humanoid local pos, onScreen = Camera:WorldToViewportPoint(hrp.Position) if onScreen and hum.Health > 0 then local sc = 1 / (pos.Z * 0.026) local w, h = 3.5 * sc, 5 * sc local x, y = pos.X - w / 2, pos.Y - h / 2 d.box.Size = Vector2.new(w, h); d.box.Position = Vector2.new(x, y); d.box.Visible = true if plr.Team and LocalPlayer.Team and plr.Team == LocalPlayer.Team then d.box.Color = Color3.fromRGB(0, 200, 255) else d.box.Color = Color3.fromRGB(255, 50, 50) end d.name.Position = Vector2.new(pos.X, y - 16 * scale); d.name.Text = plr.DisplayName or plr.Name; d.name.Visible = true local hp = hum.Health / hum.MaxHealth d.hpBar.Size = Vector2.new(3, h * hp); d.hpBar.Position = Vector2.new(x - 6, y + h * (1 - hp)) d.hpBar.Color = hp > 0.5 and Theme.success or (hp > 0.25 and Color3.fromRGB(255, 165, 0) or Theme.danger) d.hpBar.Visible = true local myRoot = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") d.dist.Text = (myRoot and math.floor((hrp.Position - myRoot.Position).Magnitude) or 0) .. "m" d.dist.Position = Vector2.new(pos.X, y + h + 4); d.dist.Visible = true else d.box.Visible = false; d.name.Visible = false; d.hpBar.Visible = false; d.dist.Visible = false end elseif d then d.box.Visible = false; d.name.Visible = false; d.hpBar.Visible = false; d.dist.Visible = false end end end end)) end local function disableESP() clearConns("espAdd"); clearConns("espRem"); clearConns("espUpd") for _, d in pairs(espDrawings) do for _, o in pairs(d) do pcall(function() o.Visible = false end) end end end -- 13. FULLBRIGHT local savedL = {} local function enableFullbright() savedL = {Brightness = Lighting.Brightness, ClockTime = Lighting.ClockTime, FogEnd = Lighting.FogEnd, GlobalShadows = Lighting.GlobalShadows, OutdoorAmbient = Lighting.OutdoorAmbient} Lighting.Brightness = 2; Lighting.ClockTime = 14; Lighting.FogEnd = 100000; Lighting.GlobalShadows = false; Lighting.OutdoorAmbient = Color3.fromRGB(128, 128, 128) addConn("fullbright", Lighting.Changed:Connect(function() if not State.toggles.fullbright then return end Lighting.Brightness = 2; Lighting.ClockTime = 14; Lighting.FogEnd = 100000; Lighting.GlobalShadows = false; Lighting.OutdoorAmbient = Color3.fromRGB(128, 128, 128) end)) end local function disableFullbright() clearConns("fullbright") for k, v in pairs(savedL) do pcall(function() Lighting[k] = v end) end end -- 14. NO FOG local function enableNoFog() Lighting.FogEnd = 100000; Lighting.FogStart = 100000 for _, v in ipairs(Lighting:GetDescendants()) do if v:IsA("Atmosphere") then v:Destroy() end end addConn("noFog", Lighting.ChildAdded:Connect(function(c) if State.toggles.noFog and c:IsA("Atmosphere") then task.defer(function() c:Destroy() end) end end)) end local function disableNoFog() clearConns("noFog") end -- 15. CHAMS local chamObjs = {} local function enableChams() addConn("chams", RunService.RenderStepped:Connect(function() if not State.toggles.chams then return end for _, plr in ipairs(Players:GetPlayers()) do if plr ~= LocalPlayer and plr.Character then for _, part in ipairs(plr.Character:GetDescendants()) do if part:IsA("BasePart") and part.Name ~= "HumanoidRootPart" and not chamObjs[part] then local a = Instance.new("BoxHandleAdornment") a.Name = "Cham"; a.Adornee = part; a.AlwaysOnTop = true a.Size = part.Size + Vector3.new(0.1, 0.1, 0.1) a.Transparency = 0.5; a.Color3 = Color3.fromRGB(255, 0, 255); a.ZIndex = 10 a.Parent = game:GetService("CoreGui") chamObjs[part] = a end end end end end)) end local function disableChams() clearConns("chams") for _, a in pairs(chamObjs) do pcall(function() a:Destroy() end) end chamObjs = {} end -- EXTRA: ANTI-AFK local function enableAntiAFK() addConn("antiAFK", LocalPlayer.Idled:Connect(function() if not State.toggles.antiAFK then return end VirtualUser:Button2(Vector2.new(0, 0)); task.wait(0.5); VirtualUser:Button2(Vector2.new(0, 0)) end)) end local function disableAntiAFK() clearConns("antiAFK") end -- EXTRA: GOD MODE local function enableGodMode() addConn("godMode", RunService.Heartbeat:Connect(function() if not State.toggles.godMode then return end local char = LocalPlayer.Character; if not char then return end local hum = char:FindFirstChildOfClass("Humanoid") if hum then hum.Health = hum.MaxHealth; pcall(function() hum:SetStateEnabled(Enum.HumanoidStateType.Dead, false) end) end end)) end local function disableGodMode() clearConns("godMode") end -- ============================================================ -- HANDLER MAP -- ============================================================ local handlers = { speedHack = {enableSpeed, disableSpeed}, jumpPower = {enableJumpPower, disableJumpPower}, fly = {enableFly, disableFly}, noclip = {enableNoclip, disableNoclip}, infJump = {enableInfJump, disableInfJump}, clickTP = {enableClickTP, disableClickTP}, aimbot = {enableAimbot, disableAimbot}, silentAim = {enableSilentAim, disableSilentAim}, reach = {enableReach, disableReach}, autoClicker = {enableAutoClicker, disableAutoClicker}, hitboxExp = {enableHitboxExp, disableHitboxExp}, esp = {enableESP, disableESP}, fullbright = {enableFullbright, disableFullbright}, noFog = {enableNoFog, disableNoFog}, chams = {enableChams, disableChams}, antiAFK = {enableAntiAFK, disableAntiAFK}, godMode = {enableGodMode, disableGodMode}, } function applyToggle(key) local h = handlers[key] if not h then return end if State.toggles[key] then h[1]() else h[2]() end end -- ============================================================ -- DRAG (fixed: delta-based, no drift) -- ============================================================ HeaderFrame.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then State.dragging = true State.dragOffset = Vector2.new(input.Position.X - State.menuX, input.Position.Y - State.menuY) end end) HeaderFrame.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then State.dragging = false end end) UserInputService.InputChanged:Connect(function(input) if State.dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then State.menuX = input.Position.X - State.dragOffset.X State.menuY = input.Position.Y - State.dragOffset.Y State.menuX = math.clamp(State.menuX, 0, viewportSize.X - W) State.menuY = math.clamp(State.menuY, 0, viewportSize.Y - HEADER_H) HeaderFrame.Position = UDim2.new(0, State.menuX, 0, State.menuY) ContentFrame.Position = UDim2.new(0, State.menuX, 0, State.menuY + HEADER_H) end end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then State.dragging = false end end) -- ============================================================ -- TOGGLE BUTTON + INSERT KEY -- ============================================================ ToggleBtn.MouseButton1Click:Connect(function() setMinimized(not State.minimized) end) HeaderFrame.InputBegan:Connect(function(input) -- Double-tap header to also toggle (optional) end) UserInputService.InputBegan:Connect(function(input, gpe) if gpe then return end if input.KeyCode == Enum.KeyCode.Insert then setMinimized(not State.minimized) end end) -- ============================================================ -- INIT -- ============================================================ switchTab(1) StarterGui:SetCore("SendNotification", { Title = "Mod Menu", Text = isMobile and "Tap ⚙ to toggle" or "INSERT to toggle", Duration = 5, }) print("[MOD MENU] Loaded — " .. (isMobile and "MOBILE" or "DESKTOP")) print("[SCALE]: " .. string.format("%.2f", scale)) print("[FEATURES]: 14 toggles + script executor")