--========================================================== -- HD Admin Helper — Pro Edition (Bypass + Blue Border) --========================================================== local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local StarterGui = game:GetService("StarterGui") local UserInputService = game:GetService("UserInputService") local TextChatService = game:GetService("TextChatService") local RunService = game:GetService("RunService") local LP = Players.LocalPlayer --== Config ==-- local PREFIXO = ";" -- Fixo local MAX_SELECT = 5 local W, H, TH = 250, 355, 24 --== Remote HD Admin ==-- local RC = ReplicatedStorage:FindFirstChild("HDAdminHDClient") and ReplicatedStorage.HDAdminHDClient:FindFirstChild("Signals") and ReplicatedStorage.HDAdminHDClient.Signals:FindFirstChild("RequestCommand") if not RC then warn("[HD Helper] HD Admin não encontrado."); return end --== Estado ==-- local mode = nil local multiList = {} local chatVisible = false local includeMe = true local loopMode = false local fastBypass = false -- NOVO: Estado do Bypass local loops = {} local nextLoopId = 1 local playerBtns = {} local searchTerm = "" local minimized = false local runningAll = false local commandHistory = {} local selectedCmds = {} local historyBtns = {} local setStatus, refreshInfo, refreshSelection --========================================================== -- HELPERS --========================================================== local function findPlayer(name) if not name then return nil end local q = name:lower():gsub("^@", "") for _, p in ipairs(Players:GetPlayers()) do if p.Name:lower() == q then return p end end for _, p in ipairs(Players:GetPlayers()) do if p.DisplayName:lower() == q then return p end end for _, p in ipairs(Players:GetPlayers()) do if p.Name:lower():sub(1, #q) == q then return p end end for _, p in ipairs(Players:GetPlayers()) do if p.DisplayName:lower():sub(1, #q) == q then return p end end return nil end local function currentGuiTarget() if mode == "ALL" then return "all" end if mode == "ME" then return "me" end if mode == "MULTI" and #multiList > 0 then return table.concat(multiList, ",") end end local function buildCommand(userCmd, guiTargetOverride) local guiTarget = guiTargetOverride if guiTargetOverride == nil then guiTarget = currentGuiTarget() end local w = {} for word in userCmd:gmatch("%S+") do table.insert(w, word) end if #w == 0 then return userCmd end local kind = nil if #w >= 2 then local c = w[2]:lower():gsub("^@", "") if c == "all" then kind = "all" elseif c == "me" then kind = "me" else local p = findPlayer(c) if p then kind = "player"; w[2] = p.Name end end end if kind == "all" then return table.concat(w, " ") end if kind == "player" then return table.concat(w, " ") end if kind == "me" then if guiTarget == "all" then table.insert(w, 2, "all"); return table.concat(w, " ") elseif guiTarget and guiTarget ~= "me" then w[2] = guiTarget; return table.concat(w, " ") else return table.concat(w, " ") end end if guiTarget then if guiTarget == "all" or guiTarget == "me" then table.insert(w, 2, guiTarget) else local parts = {} for name in guiTarget:gmatch("[^,]+") do local p = findPlayer(name) table.insert(parts, p and p.Name or name) end table.insert(w, 2, table.concat(parts, ",")) end end return table.concat(w, " ") end local function replaceAllTarget(str, newName) local w = {} for word in str:gmatch("%S+") do table.insert(w, word) end if #w >= 2 and w[2]:lower() == "all" then w[2] = newName end return table.concat(w, " ") end local function getTargetPlayers() local t = {} for _, p in ipairs(Players:GetPlayers()) do if p == LP then if includeMe then table.insert(t, p) end else table.insert(t, p) end end return t end local function getUndoCommand(rawCmd) local w = {} for word in rawCmd:gmatch("%S+") do table.insert(w, word) end if #w == 0 then return "un" .. rawCmd end w[1] = "un" .. w[1] return table.concat(w, " ") end --========================================================== -- CHAT / REMOTE --========================================================== local function sendRealChat(text) local ok = pcall(function() local ch = TextChatService:FindFirstChild("TextChannels") if ch then local g = ch:FindFirstChild("RBXGeneral") or ch:FindFirstChildWhichIsA("TextChannel") if g then g:SendAsync(text); return true end end return false end) if ok then return true end return pcall(function() StarterGui:SetCore("ChatSendMessage", text) end) end local function sendRemote(cmd) pcall(function() RC:InvokeServer(PREFIXO .. cmd) end) end --========================================================== -- UI CONSTRUCTION --========================================================== local gui = Instance.new("ScreenGui") gui.Name = "HDHelper" gui.ResetOnSpawn = false gui.IgnoreGuiInset = true gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling gui.Parent = LP:WaitForChild("PlayerGui") local main = Instance.new("Frame") main.Size = UDim2.new(0, W, 0, H) main.Position = UDim2.new(0, 12, 0.5, -H/2) main.BackgroundColor3 = Color3.fromRGB(14, 15, 22) main.BorderSizePixel = 0 main.Active = true main.Draggable = true main.ClipsDescendants = true main.Parent = gui Instance.new("UICorner", main).CornerRadius = UDim.new(0, 10) local mst = Instance.new("UIStroke", main) mst.Color = Color3.fromRGB(30, 120, 255); mst.Thickness = 1.5 local bar = Instance.new("Frame") bar.Size = UDim2.new(1, 0, 0, TH) bar.BackgroundColor3 = Color3.fromRGB(22, 24, 36) bar.BorderSizePixel = 0 bar.Parent = main Instance.new("UICorner", bar).CornerRadius = UDim.new(0, 10) local grad = Instance.new("UIGradient") grad.Color = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.fromRGB(30, 60, 120)), ColorSequenceKeypoint.new(1, Color3.fromRGB(40, 40, 80))}) grad.Parent = bar local title = Instance.new("TextLabel") title.Size = UDim2.new(1, -60, 1, 0) title.Position = UDim2.new(0, 12, 0, 0) title.BackgroundTransparency = 1 title.Text = "HD Admin" title.TextColor3 = Color3.fromRGB(235, 238, 255) title.Font = Enum.Font.GothamBold title.TextSize = 11 title.TextXAlignment = Enum.TextXAlignment.Left title.Parent = bar local function titleBtn(txt, x, bg) local b = Instance.new("TextButton") b.Size = UDim2.new(0, 16, 0, 16) b.Position = UDim2.new(1, x, 0, 4) b.BackgroundColor3 = bg b.Text = txt b.TextColor3 = Color3.fromRGB(255, 255, 255) b.Font = Enum.Font.GothamBold b.TextSize = 11 b.Parent = bar Instance.new("UICorner", b).CornerRadius = UDim.new(0, 4) return b end local minBtn = titleBtn("—", -42, Color3.fromRGB(70, 75, 105)) local closeBtn = titleBtn("×", -22, Color3.fromRGB(190, 55, 60)) local content = Instance.new("Frame") content.Size = UDim2.new(1, 0, 1, -TH) content.Position = UDim2.new(0, 0, 0, TH) content.BackgroundTransparency = 1 content.Parent = main local inputWrap = Instance.new("Frame") inputWrap.Size = UDim2.new(1, -12, 0, 24) inputWrap.Position = UDim2.new(0, 6, 0, 6) inputWrap.BackgroundColor3 = Color3.fromRGB(26, 28, 42) inputWrap.BorderSizePixel = 0 inputWrap.Parent = content Instance.new("UICorner", inputWrap).CornerRadius = UDim.new(0, 6) local prefixLbl = Instance.new("TextLabel") prefixLbl.Size = UDim2.new(0, 20, 1, 0) prefixLbl.BackgroundTransparency = 1 prefixLbl.Text = PREFIXO prefixLbl.TextColor3 = Color3.fromRGB(130, 180, 255) prefixLbl.Font = Enum.Font.GothamBold prefixLbl.TextSize = 12 prefixLbl.Parent = inputWrap local cmdBox = Instance.new("TextBox") cmdBox.Size = UDim2.new(1, -26, 1, 0) cmdBox.Position = UDim2.new(0, 22, 0, 0) cmdBox.BackgroundTransparency = 1 cmdBox.TextColor3 = Color3.fromRGB(255, 255, 255) cmdBox.PlaceholderText = "Ex: fly me / teleport all..." cmdBox.PlaceholderColor3 = Color3.fromRGB(100, 105, 130) cmdBox.Font = Enum.Font.Gotham cmdBox.TextSize = 10 cmdBox.Text = "" cmdBox.TextXAlignment = Enum.TextXAlignment.Left cmdBox.ClearTextOnFocus = false cmdBox.Parent = inputWrap local row1 = Instance.new("Frame") row1.Size = UDim2.new(1, -12, 0, 20) row1.Position = UDim2.new(0, 6, 0, 34) row1.BackgroundTransparency = 1 row1.Parent = content local function mkChip(parent, x, w, txt, bg) local b = Instance.new("TextButton") b.Size = UDim2.new(w, -2, 1, 0) b.Position = UDim2.new(x, 0, 0, 0) b.BackgroundColor3 = bg or Color3.fromRGB(36, 38, 54) b.Text = txt b.TextColor3 = Color3.fromRGB(220, 225, 245) b.Font = Enum.Font.GothamBold b.TextSize = 9 b.Parent = parent Instance.new("UICorner", b).CornerRadius = UDim.new(0, 4) return b end local allBtn = mkChip(row1, 0, 0.5, "Todos") local meBtn = mkChip(row1, 0.5, 0.5, "Eu mesmo") local row2 = Instance.new("Frame") row2.Size = UDim2.new(1, -12, 0, 20) row2.Position = UDim2.new(0, 6, 0, 58) row2.BackgroundTransparency = 1 row2.Parent = content local inclChip = mkChip(row2, 0, 0.28, "☑ Com eu", Color3.fromRGB(40, 100, 60)) local chatChip = mkChip(row2, 0.28, 0.24, "Chat OFF") local loopChip = mkChip(row2, 0.52, 0.24, "Loop OFF") local speedChip = mkChip(row2, 0.76, 0.24, "Speed 10", Color3.fromRGB(36, 38, 54)) -- Novo Botão local histTitle = Instance.new("TextLabel") histTitle.Size = UDim2.new(1, -12, 0, 12) histTitle.Position = UDim2.new(0, 6, 0, 82) histTitle.BackgroundTransparency = 1 histTitle.Text = "⚡ Comandos (1 Click = Marcar / 2 Clicks = Repetir)" histTitle.TextColor3 = Color3.fromRGB(200, 170, 255) histTitle.Font = Enum.Font.GothamBold histTitle.TextSize = 8 histTitle.TextXAlignment = Enum.TextXAlignment.Left histTitle.Parent = content local histList = Instance.new("ScrollingFrame") histList.Size = UDim2.new(1, -12, 0, 36) histList.Position = UDim2.new(0, 6, 0, 96) histList.BackgroundColor3 = Color3.fromRGB(20, 22, 34) histList.BorderSizePixel = 0 histList.CanvasSize = UDim2.new() histList.ScrollBarThickness = 2 histList.Parent = content Instance.new("UICorner", histList).CornerRadius = UDim.new(0, 5) local hlLayout = Instance.new("UIListLayout") hlLayout.Padding = UDim.new(0, 2) hlLayout.SortOrder = Enum.SortOrder.LayoutOrder hlLayout.Parent = histList hlLayout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function() histList.CanvasSize = UDim2.new(0,0,0,hlLayout.AbsoluteContentSize.Y+4) end) local searchWrap = Instance.new("Frame") searchWrap.Size = UDim2.new(1, -12, 0, 22) searchWrap.Position = UDim2.new(0, 6, 0, 136) searchWrap.BackgroundColor3 = Color3.fromRGB(26, 28, 42) searchWrap.BorderSizePixel = 0 searchWrap.Parent = content Instance.new("UICorner", searchWrap).CornerRadius = UDim.new(0, 6) local searchBox = Instance.new("TextBox") searchBox.Size = UDim2.new(1, -10, 1, 0) searchBox.Position = UDim2.new(0, 6, 0, 0) searchBox.BackgroundTransparency = 1 searchBox.TextColor3 = Color3.fromRGB(240, 240, 250) searchBox.PlaceholderText = "🔍 Pesquisar jogador..." searchBox.PlaceholderColor3 = Color3.fromRGB(110, 113, 138) searchBox.Font = Enum.Font.Gotham searchBox.TextSize = 10 searchBox.Text = "" searchBox.TextXAlignment = Enum.TextXAlignment.Left searchBox.ClearTextOnFocus = false searchBox.Parent = searchWrap local list = Instance.new("ScrollingFrame") list.Size = UDim2.new(1, -12, 0, 65) list.Position = UDim2.new(0, 6, 0, 162) list.BackgroundColor3 = Color3.fromRGB(20, 22, 34) list.BorderSizePixel = 0 list.CanvasSize = UDim2.new() list.ScrollBarThickness = 2 list.Parent = content Instance.new("UICorner", list).CornerRadius = UDim.new(0, 5) local layout = Instance.new("UIListLayout") layout.Padding = UDim.new(0, 2) layout.SortOrder = Enum.SortOrder.LayoutOrder layout.Parent = list layout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function() list.CanvasSize = UDim2.new(0,0,0,layout.AbsoluteContentSize.Y+4) end) local infoRow = Instance.new("Frame") infoRow.Size = UDim2.new(1, -12, 0, 16) infoRow.Position = UDim2.new(0, 6, 0, 231) infoRow.BackgroundTransparency = 1 infoRow.Parent = content local infoLbl = Instance.new("TextLabel") infoLbl.Size = UDim2.new(0.6, 0, 1, 0) infoLbl.BackgroundTransparency = 1 infoLbl.Text = "Alvo: Sem alvo" infoLbl.TextColor3 = Color3.fromRGB(150, 185, 255) infoLbl.Font = Enum.Font.GothamMedium infoLbl.TextSize = 9 infoLbl.TextXAlignment = Enum.TextXAlignment.Left infoLbl.Parent = infoRow local loopsBtn = Instance.new("TextButton") loopsBtn.Size = UDim2.new(0.4, 0, 1, 0) loopsBtn.Position = UDim2.new(0.6, 0, 0, 0) loopsBtn.BackgroundColor3 = Color3.fromRGB(80, 40, 55) loopsBtn.Text = "Limpar Loops (0)" loopsBtn.TextColor3 = Color3.fromRGB(255, 215, 215) loopsBtn.Font = Enum.Font.GothamBold loopsBtn.TextSize = 8 loopsBtn.Parent = infoRow Instance.new("UICorner", loopsBtn).CornerRadius = UDim.new(0, 3) local rowBottom = Instance.new("Frame") rowBottom.Size = UDim2.new(1, -12, 0, 20) rowBottom.Position = UDim2.new(0, 6, 0, 251) rowBottom.BackgroundTransparency = 1 rowBottom.Parent = content local stopSelBtn = Instance.new("TextButton") stopSelBtn.Size = UDim2.new(0.6, -2, 1, 0) stopSelBtn.BackgroundColor3 = Color3.fromRGB(180, 50, 50) stopSelBtn.Text = "🛑 Parar Marcados (un)" stopSelBtn.TextColor3 = Color3.fromRGB(255, 255, 255) stopSelBtn.Font = Enum.Font.GothamBold stopSelBtn.TextSize = 8 stopSelBtn.Parent = rowBottom Instance.new("UICorner", stopSelBtn).CornerRadius = UDim.new(0, 4) local stopAllBtn = Instance.new("TextButton") stopAllBtn.Size = UDim2.new(0.4, -2, 1, 0) stopAllBtn.Position = UDim2.new(0.6, 2, 0, 0) stopAllBtn.BackgroundColor3 = Color3.fromRGB(120, 50, 50) stopAllBtn.Text = "Limpar Tudo" stopAllBtn.TextColor3 = Color3.fromRGB(255, 255, 255) stopAllBtn.Font = Enum.Font.GothamBold stopAllBtn.TextSize = 8 stopAllBtn.Parent = rowBottom Instance.new("UICorner", stopAllBtn).CornerRadius = UDim.new(0, 4) local statusLbl = Instance.new("TextLabel") statusLbl.Size = UDim2.new(1, -12, 0, 12) statusLbl.Position = UDim2.new(0, 6, 0, 275) statusLbl.BackgroundTransparency = 1 statusLbl.Text = "Pronto." statusLbl.TextColor3 = Color3.fromRGB(140, 210, 150) statusLbl.Font = Enum.Font.Gotham statusLbl.TextSize = 9 statusLbl.TextXAlignment = Enum.TextXAlignment.Center statusLbl.Parent = content -- Botão Minimizado Quadrado com Borda Azul local reopen = Instance.new("TextButton") reopen.Size = UDim2.new(0, 32, 0, 32) reopen.Position = UDim2.new(0, 12, 0.5, -16) reopen.BackgroundColor3 = Color3.fromRGB(20, 24, 36) reopen.Text = "HD" reopen.TextColor3 = Color3.fromRGB(200, 220, 255) reopen.Font = Enum.Font.GothamBold reopen.TextSize = 10 reopen.Visible = false reopen.Parent = gui Instance.new("UICorner", reopen).CornerRadius = UDim.new(0, 8) local rs = Instance.new("UIStroke", reopen) rs.Color = Color3.fromRGB(30, 120, 255); rs.Thickness = 1.5 local expanded = UDim2.new(0, W, 0, H) local minSize = UDim2.new(0, W, 0, TH) minBtn.MouseButton1Click:Connect(function() minimized = not minimized if minimized then content.Visible = false; main.Size = minSize; minBtn.Text = "+" else content.Visible = true; main.Size = expanded; minBtn.Text = "—" end end) closeBtn.MouseButton1Click:Connect(function() main.Visible = false; reopen.Visible = true end) reopen.MouseButton1Click:Connect(function() main.Visible = true; reopen.Visible = false end) --========================================================== -- CONTROLE DE HISTÓRICO --========================================================== local function registerCommand(fullCmd) for _, c in ipairs(commandHistory) do if c == fullCmd then return end end table.insert(commandHistory, fullCmd) local b = Instance.new("TextButton") b.Size = UDim2.new(1, -4, 0, 16) b.BackgroundColor3 = Color3.fromRGB(30, 32, 45) b.Text = fullCmd b.TextColor3 = Color3.fromRGB(220, 225, 245) b.Font = Enum.Font.Gotham b.TextSize = 9 b.TextXAlignment = Enum.TextXAlignment.Left b.TextTruncate = Enum.TextTruncate.AtEnd b.Parent = histList Instance.new("UICorner", b).CornerRadius = UDim.new(0, 3) Instance.new("UIPadding", b).PaddingLeft = UDim.new(0, 4) local lastClick = 0 b.MouseButton1Click:Connect(function() local currentTime = tick() if currentTime - lastClick < 0.35 then if loopMode then startLoop(fullCmd) setStatus("Loop reiniciado: " .. fullCmd) else if mode == "ALL" then executeAll(fullCmd) else executeSingle(fullCmd) end setStatus("Reexecutado: " .. fullCmd) end lastClick = 0 else local isSelected = false for i, cmd in ipairs(selectedCmds) do if cmd == fullCmd then table.remove(selectedCmds, i) isSelected = true break end end if isSelected then b.BackgroundColor3 = Color3.fromRGB(30, 32, 45) else if #selectedCmds >= MAX_SELECT then setStatus("Máx " .. MAX_SELECT .. " marcados.", Color3.fromRGB(255, 160, 160)) return end table.insert(selectedCmds, fullCmd) b.BackgroundColor3 = Color3.fromRGB(65, 105, 225) end lastClick = currentTime end end) table.insert(historyBtns, b) end --========================================================== -- LISTA DE JOGADORES --========================================================== local function labelFor(p) return p.DisplayName ~= p.Name and (p.DisplayName .. " (@" .. p.Name .. ")") or p.Name end local function inMulti(name) for _, n in ipairs(multiList) do if n == name then return true end end return false end local function matchesSearch(p) if searchTerm == "" then return true end local q = searchTerm:lower() return p.Name:lower():find(q, 1, true) ~= nil or p.DisplayName:lower():find(q, 1, true) ~= nil end local function refreshFilter() for _, p in ipairs(Players:GetPlayers()) do local b = playerBtns[p.Name] if b then b.Visible = matchesSearch(p) end end end local function addPlayer(p) if p == LP or playerBtns[p.Name] then return end local b = Instance.new("TextButton") b.Size = UDim2.new(1, -4, 0, 18) b.BackgroundColor3 = Color3.fromRGB(30, 32, 45) b.Text = "" b.Parent = list Instance.new("UICorner", b).CornerRadius = UDim.new(0, 4) local lbl = Instance.new("TextLabel") lbl.Size = UDim2.new(1, -20, 1, 0) lbl.Position = UDim2.new(0, 16, 0, 0) lbl.BackgroundTransparency = 1 lbl.Text = labelFor(p) lbl.TextColor3 = Color3.fromRGB(230, 232, 245) lbl.Font = Enum.Font.Gotham lbl.TextSize = 9 lbl.TextXAlignment = Enum.TextXAlignment.Left lbl.TextTruncate = Enum.TextTruncate.AtEnd lbl.Parent = b local dot = Instance.new("Frame") dot.Size = UDim2.new(0, 4, 0, 4) dot.Position = UDim2.new(0, 6, 0.5, -2) dot.BackgroundColor3 = Color3.fromRGB(110, 220, 130) dot.Parent = b Instance.new("UICorner", dot).CornerRadius = UDim.new(1, 0) b.MouseButton1Click:Connect(function() if mode == "ALL" or mode == "ME" or mode == nil then mode = "MULTI"; multiList = {p.Name} else local found = false for i, n in ipairs(multiList) do if n == p.Name then table.remove(multiList, i); found = true; break end end if not found then if #multiList >= MAX_SELECT then return end table.insert(multiList, p.Name) end if #multiList == 0 then mode = nil end end refreshSelection() end) b.Visible = matchesSearch(p) playerBtns[p.Name] = b end local function removePlayer(p) local b = playerBtns[p.Name] if b then b:Destroy(); playerBtns[p.Name] = nil for i, n in ipairs(multiList) do if n == p.Name then table.remove(multiList, i); break end end if #multiList == 0 and mode == "MULTI" then mode = nil end refreshSelection() end end for _, p in ipairs(Players:GetPlayers()) do addPlayer(p) end Players.PlayerAdded:Connect(addPlayer) Players.PlayerRemoving:Connect(removePlayer) searchBox:GetPropertyChangedSignal("Text"):Connect(function() searchTerm = searchBox.Text refreshFilter() end) --========================================================== -- HELPERS DE UI --========================================================== function setStatus(t, c) statusLbl.Text = t or ""; statusLbl.TextColor3 = c or Color3.fromRGB(140, 210, 150) end function refreshInfo() if mode == "ALL" then infoLbl.Text = "Alvo: TODOS" .. (includeMe and " (+eu)" or "") elseif mode == "ME" then infoLbl.Text = "Alvo: Você" elseif mode == "MULTI" then infoLbl.Text = "Alvo: " .. #multiList .. "/" .. MAX_SELECT else infoLbl.Text = "Sem alvo" end loopsBtn.Text = "Limpar Loops (" .. #loops .. ")" end function refreshSelection() for name, b in pairs(playerBtns) do b.BackgroundColor3 = (mode == "MULTI" and inMulti(name)) and Color3.fromRGB(65, 105, 225) or Color3.fromRGB(30, 32, 45) end allBtn.BackgroundColor3 = (mode == "ALL") and Color3.fromRGB(65, 105, 225) or Color3.fromRGB(30, 32, 45) meBtn.BackgroundColor3 = (mode == "ME") and Color3.fromRGB(65, 105, 225) or Color3.fromRGB(30, 32, 45) refreshInfo() end --========================================================== -- EXECUÇÃO SIMPLES / ALL --========================================================== function executeSingle(rawCmd, isUndo) local built = buildCommand(rawCmd) if not isUndo then registerCommand(built) end if chatVisible then sendRealChat(PREFIXO .. built) else sendRemote(built) end setStatus("Enviado: " .. built) end function executeAll(rawCmd, isUndo) if runningAll then return end runningAll = true local template = buildCommand(rawCmd, "all") if not isUndo then registerCommand(template) end if chatVisible then sendRealChat(PREFIXO .. template); task.wait(0.4) end local snapshot = getTargetPlayers() task.spawn(function() for i, p in ipairs(snapshot) do if p and p.Parent then local built = replaceAllTarget(template, p.Name) pcall(function() RC:InvokeServer(PREFIXO .. built) end) setStatus(("• %d/%d %s"):format(i, #snapshot, built)) end -- O Bypass usa a velocidade 100 ou 10 if fastBypass then RunService.Heartbeat:Wait() else task.wait(0.1) end end setStatus("✔ " .. #snapshot .. " enviados") runningAll = false end) end --========================================================== -- LOOPS — Sincronização e Bypass de Velocidade --========================================================== local function killLoop(l) if not l then return end l.alive = false for _, c in ipairs(l.conns) do pcall(function() if c and c.Disconnect then c:Disconnect() end end) end l.conns = {}; l.tracked = {} end local function clearLoops() for _, l in ipairs(loops) do killLoop(l) end loops = {}; refreshInfo() end local function processLoopsForPlayer(p) if not p or not p.Parent or not p.Character then return end local hum = p.Character:FindFirstChildOfClass("Humanoid") if not hum or hum.Health <= 0 then return end local commandsToSend = {} for _, l in ipairs(loops) do if l.alive and l.mode == "ALL" then table.insert(commandsToSend, l.cmd) end end -- Envia comandos de acordo com a velocidade task.spawn(function() for _, cmd in ipairs(commandsToSend) do local built = replaceAllTarget(buildCommand(cmd, "all"), p.Name) pcall(function() RC:InvokeServer(PREFIXO .. built) end) -- Bypass Inteligente: -- Se estiver ON (Speed 100), usa Heartbeat (aproximadamente 60 vezes por segundo, sem delay manual). -- Se estiver OFF (Speed 10), usa task.wait(0.1). if fastBypass then RunService.Heartbeat:Wait() else task.wait(0.1) end end end) end function startLoop(rawCmd) local loop = { id = nextLoopId, cmd = rawCmd, mode = mode, alive = true, conns = {}, tracked = {} } nextLoopId += 1 local template = buildCommand(rawCmd) registerCommand(template) if chatVisible then sendRealChat(PREFIXO .. template) end local function live() return loop.alive end local function cmdFor(p) if loop.mode == "ALL" then return replaceAllTarget(template, p.Name) elseif loop.mode == "ME" then return buildCommand(rawCmd, "me") else local w = {} for word in rawCmd:gmatch("%S+") do table.insert(w, word) end if #w >= 2 then local c = w[2]:lower():gsub("^@", "") if c == "all" or c == "me" or findPlayer(c) then table.remove(w, 2) end end table.insert(w, 2, p.Name) return table.concat(w, " ") end end local function sendToPlayer(p) if not live() or not p or not p.Parent then return end local char = p.Character if not char then return end local hum = char:FindFirstChildOfClass("Humanoid") if not hum or hum.Health <= 0 then return end local built = cmdFor(p) sendRemote(built) setStatus(("⟳ #%d %s → %s"):format(loop.id, built, p.Name), Color3.fromRGB(255, 200, 120)) end local function track(p) if not live() or loop.tracked[p] then return end loop.tracked[p] = true if p.Character then task.spawn(function() task.wait(0.5) if live() then if loop.mode == "ALL" then processLoopsForPlayer(p) else sendToPlayer(p) end end end) end local charConn = p.CharacterAdded:Connect(function(newChar) if not live() then return end local hum = newChar:WaitForChild("Humanoid", 3) if hum then task.wait(0.1) if live() then if loop.mode == "ALL" then processLoopsForPlayer(p) else sendToPlayer(p) end end end end) table.insert(loop.conns, charConn) end task.spawn(function() if loop.mode == "ALL" then for _, p in ipairs(getTargetPlayers()) do if live() then track(p); task.wait(0.05) end end elseif loop.mode == "ME" then track(LP) else for _, n in ipairs(multiList) do if live() then local p = Players:FindFirstChild(n); if p then track(p) end; task.wait(0.05) end end end end) table.insert(loop.conns, Players.PlayerAdded:Connect(function(np) if not live() then return end task.wait(1) if not live() then return end local shouldTrack = false if loop.mode == "ALL" then if includeMe or np ~= LP then shouldTrack = true end elseif loop.mode == "ME" then if np == LP then shouldTrack = true end else for _, name in ipairs(multiList) do if findPlayer(name) == np then shouldTrack = true; break end end end if shouldTrack then track(np) end end)) table.insert(loop.conns, Players.PlayerRemoving:Connect(function(p) loop.tracked[p] = nil end)) table.insert(loops, loop) refreshInfo() end --========================================================== -- EVENTOS --========================================================== allBtn.MouseButton1Click:Connect(function() mode = "ALL"; multiList = {}; refreshSelection() end) meBtn.MouseButton1Click:Connect(function() mode = "ME"; multiList = {}; refreshSelection() end) inclChip.MouseButton1Click:Connect(function() includeMe = not includeMe inclChip.Text = includeMe and "☑ Com eu" or "☐ Com eu" inclChip.BackgroundColor3 = includeMe and Color3.fromRGB(40, 100, 60) or Color3.fromRGB(80, 45, 55) refreshInfo() end) chatChip.MouseButton1Click:Connect(function() chatVisible = not chatVisible chatChip.Text = chatVisible and "Chat ON" or "Chat OFF" chatChip.BackgroundColor3 = chatVisible and Color3.fromRGB(40, 120, 65) or Color3.fromRGB(36, 38, 54) end) loopChip.MouseButton1Click:Connect(function() loopMode = not loopMode loopChip.Text = loopMode and "Loop ON" or "Loop OFF" loopChip.BackgroundColor3 = loopMode and Color3.fromRGB(150, 100, 30) or Color3.fromRGB(36, 38, 54) if not loopMode and #loops > 0 then clearLoops(); setStatus("Loops encerrados.") end end) -- BOTÃO DE VELOCIDADE (Speed 10 / Speed 100) speedChip.MouseButton1Click:Connect(function() fastBypass = not fastBypass speedChip.Text = fastBypass and "Speed 100" or "Speed 10" speedChip.BackgroundColor3 = fastBypass and Color3.fromRGB(60, 100, 180) or Color3.fromRGB(36, 38, 54) setStatus(fastBypass and "Bypass Ativado (Quase Instantâneo)" or "Bypass Desativado (Normal)") end) loopsBtn.MouseButton1Click:Connect(function() clearLoops(); setStatus("Loops limpos.") end) cmdBox.FocusLost:Connect(function(enterPressed) if not enterPressed then return end local raw = cmdBox.Text:gsub("^%s+", ""):gsub("%s+$", "") if raw == "" then return end cmdBox.Text = "" if not mode then setStatus("Escolha um alvo.", Color3.fromRGB(255, 160, 160)); return end if loopMode then startLoop(raw) elseif mode == "ALL" then executeAll(raw) else executeSingle(raw) end end) stopSelBtn.MouseButton1Click:Connect(function() if #selectedCmds == 0 then setStatus("Nenhum marcado.", Color3.fromRGB(255, 160, 160)); return end local toStop = {unpack(selectedCmds)} for _, cmd in ipairs(toStop) do local undoCmd = getUndoCommand(cmd) if mode == "ALL" then executeAll(undoCmd, true) else executeSingle(undoCmd, true) end for i, btn in ipairs(historyBtns) do if btn.Text == cmd then btn:Destroy(); table.remove(historyBtns, i); break end end for i, c in ipairs(commandHistory) do if c == cmd then table.remove(commandHistory, i); break end end end selectedCmds = {}; setStatus("Parados com UN.") end) stopAllBtn.MouseButton1Click:Connect(function() if #commandHistory == 0 then return end for _, cmd in ipairs(commandHistory) do local undoCmd = getUndoCommand(cmd) if mode == "ALL" then executeAll(undoCmd, true) else executeSingle(undoCmd, true) end end for _, btn in ipairs(historyBtns) do btn:Destroy() end commandHistory = {}; historyBtns = {}; selectedCmds = {} setStatus("Todos parados.") end) UserInputService.InputBegan:Connect(function(i, g) if g then return end if i.KeyCode == Enum.KeyCode.RightShift then main.Visible = not main.Visible reopen.Visible = not main.Visible end end) refreshSelection() setStatus("Pronto.")