Created
July 25, 2026 04:36
-
-
Save DuyNgao2306/9daf6d20fbaaff448bc39763d8b3fde8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| -- [[ VISUAL AUTO CLICKER - WAYPOINTS EDITION ]] -- | |
| local Players = game:GetService("Players") | |
| local UserInputService = game:GetService("UserInputService") | |
| local VirtualInputManager = game:GetService("VirtualInputManager") | |
| local GuiService = game:GetService("GuiService") | |
| local LocalPlayer = Players.LocalPlayer | |
| local PlayerGui = LocalPlayer:WaitForChild("PlayerGui") | |
| math.randomseed(os.time()) | |
| if PlayerGui:FindFirstChild("MacroSystemGui") then | |
| PlayerGui.MacroSystemGui:Destroy() | |
| end | |
| local pointsData = {} -- Lưu trữ: {id, frame, delay} | |
| local MAX_CLICKS = 100 | |
| local currentMode = "None" -- "Add", "Move", "Time", "Run" | |
| local isRunning = false | |
| local connections = {} | |
| local currentlyEditingPoint = nil | |
| -- 1. TẠO GIAO DIỆN CHÍNH | |
| local ScreenGui = Instance.new("ScreenGui") | |
| ScreenGui.Name = "MacroSystemGui" | |
| ScreenGui.ResetOnSpawn = false | |
| ScreenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling | |
| ScreenGui.DisplayOrder = 999 | |
| ScreenGui.Parent = PlayerGui | |
| local PointsFolder = Instance.new("Folder") | |
| PointsFolder.Name = "PointsFolder" | |
| PointsFolder.Parent = ScreenGui | |
| local MainFrame = Instance.new("Frame") | |
| MainFrame.Name = "MainFrame" | |
| MainFrame.Size = UDim2.new(0, 300, 0, 300) | |
| MainFrame.Position = UDim2.new(0.5, -150, 0.3, 0) | |
| MainFrame.BackgroundColor3 = Color3.fromRGB(25, 27, 38) | |
| MainFrame.BorderSizePixel = 0 | |
| MainFrame.Active = true | |
| MainFrame.Parent = ScreenGui | |
| local UICorner = Instance.new("UICorner") | |
| UICorner.CornerRadius = UDim.new(0, 10) | |
| UICorner.Parent = MainFrame | |
| local UIStroke = Instance.new("UIStroke") | |
| UIStroke.Color = Color3.fromRGB(60, 65, 85) | |
| UIStroke.Thickness = 1.5 | |
| UIStroke.Parent = MainFrame | |
| local Header = Instance.new("Frame") | |
| Header.Size = UDim2.new(1, 0, 0, 38) | |
| Header.BackgroundColor3 = Color3.fromRGB(35, 38, 52) | |
| Header.BorderSizePixel = 0 | |
| Header.Parent = MainFrame | |
| local HeaderCorner = Instance.new("UICorner") | |
| HeaderCorner.CornerRadius = UDim.new(0, 10) | |
| HeaderCorner.Parent = Header | |
| local Title = Instance.new("TextLabel") | |
| Title.Size = UDim2.new(1, -50, 1, 0) | |
| Title.Position = UDim2.new(0, 12, 0, 0) | |
| Title.BackgroundTransparency = 1 | |
| Title.Text = "✨ VISUAL AUTO CLICKER" | |
| Title.TextColor3 = Color3.fromRGB(255, 255, 255) | |
| Title.TextSize = 14 | |
| Title.Font = Enum.Font.GothamBold | |
| Title.TextXAlignment = Enum.TextXAlignment.Left | |
| Title.Parent = Header | |
| local CloseBtn = Instance.new("TextButton") | |
| CloseBtn.Size = UDim2.new(0, 30, 0, 30) | |
| CloseBtn.Position = UDim2.new(1, -5, 0.5, 0) | |
| CloseBtn.AnchorPoint = Vector2.new(1, 0.5) | |
| CloseBtn.BackgroundTransparency = 1 | |
| CloseBtn.Text = "✕" | |
| CloseBtn.TextColor3 = Color3.fromRGB(255, 71, 87) | |
| CloseBtn.TextSize = 18 | |
| CloseBtn.Font = Enum.Font.GothamBold | |
| CloseBtn.ZIndex = 10 | |
| CloseBtn.Parent = Header | |
| local StatusLabel = Instance.new("TextLabel") | |
| StatusLabel.Size = UDim2.new(1, -24, 0, 20) | |
| StatusLabel.Position = UDim2.new(0, 12, 0, 45) | |
| StatusLabel.BackgroundTransparency = 1 | |
| StatusLabel.Text = "Trạng thái: Đang nghỉ" | |
| StatusLabel.TextColor3 = Color3.fromRGB(180, 185, 200) | |
| StatusLabel.TextSize = 13 | |
| StatusLabel.Font = Enum.Font.GothamMedium | |
| StatusLabel.TextXAlignment = Enum.TextXAlignment.Left | |
| StatusLabel.Parent = MainFrame | |
| -- CONTAINER CHỨA NÚT CHỨC NĂNG | |
| local BtnContainer = Instance.new("Frame") | |
| BtnContainer.Size = UDim2.new(1, -24, 1, -80) | |
| BtnContainer.Position = UDim2.new(0, 12, 0, 75) | |
| BtnContainer.BackgroundTransparency = 1 | |
| BtnContainer.Parent = MainFrame | |
| local GridLayout = Instance.new("UIGridLayout") | |
| GridLayout.CellSize = UDim2.new(0.5, -5, 0, 35) | |
| GridLayout.CellPadding = UDim2.new(0, 10, 0, 10) | |
| GridLayout.SortOrder = Enum.SortOrder.LayoutOrder | |
| GridLayout.Parent = BtnContainer | |
| local function createButton(name, text, color, order) | |
| local btn = Instance.new("TextButton") | |
| btn.Name = name | |
| btn.BackgroundColor3 = color | |
| btn.Text = text | |
| btn.TextColor3 = Color3.fromRGB(255, 255, 255) | |
| btn.Font = Enum.Font.GothamBold | |
| btn.TextSize = 12 | |
| btn.LayoutOrder = order | |
| btn.Parent = BtnContainer | |
| local corner = Instance.new("UICorner") | |
| corner.CornerRadius = UDim.new(0, 6) | |
| corner.Parent = btn | |
| return btn | |
| end | |
| local BtnAdd = createButton("BtnAdd", "➕ Thêm Điểm", Color3.fromRGB(108, 92, 231), 1) | |
| local BtnMove = createButton("BtnMove", "🖐️ Di Chuyển", Color3.fromRGB(225, 112, 85), 2) | |
| local BtnTime = createButton("BtnTime", "⏱️ Chỉnh Time", Color3.fromRGB(9, 132, 227), 3) | |
| local BtnClear = createButton("BtnClear", "🗑️ Xóa Tất Cả", Color3.fromRGB(178, 190, 195), 4) | |
| local BtnStart = createButton("BtnStart", "▶️ CHẠY MACRO", Color3.fromRGB(0, 184, 148), 5) | |
| BtnStart.Size = UDim2.new(1, 0, 0, 45) -- Nút chạy bự hơn | |
| GridLayout.FillDirectionMaxCells = 2 | |
| -- 2. BẢNG POPUP CHỈNH TIME | |
| local TimePopup = Instance.new("Frame") | |
| TimePopup.Size = UDim2.new(0, 200, 0, 120) | |
| TimePopup.Position = UDim2.new(0.5, 0, 0.5, 0) | |
| TimePopup.AnchorPoint = Vector2.new(0.5, 0.5) | |
| TimePopup.BackgroundColor3 = Color3.fromRGB(45, 52, 54) | |
| TimePopup.Visible = false | |
| TimePopup.ZIndex = 50 | |
| TimePopup.Parent = ScreenGui | |
| local PopupCorner = Instance.new("UICorner"); PopupCorner.CornerRadius = UDim.new(0, 10); PopupCorner.Parent = TimePopup | |
| local PopupLabel = Instance.new("TextLabel") | |
| PopupLabel.Size = UDim2.new(1, 0, 0, 30); PopupLabel.Position = UDim2.new(0,0,0,10); PopupLabel.BackgroundTransparency = 1 | |
| PopupLabel.Text = "Nhập thời gian trễ (giây):" ; PopupLabel.TextColor3 = Color3.new(1,1,1); PopupLabel.Font = Enum.Font.GothamBold; PopupLabel.Parent = TimePopup | |
| local TimeInput = Instance.new("TextBox") | |
| TimeInput.Size = UDim2.new(0.8, 0, 0, 30); TimeInput.Position = UDim2.new(0.1, 0, 0, 40); TimeInput.BackgroundColor3 = Color3.fromRGB(20,20,20); TimeInput.TextColor3 = Color3.new(1,1,1) | |
| TimeInput.Text = "0.1"; TimeInput.Font = Enum.Font.GothamMedium; TimeInput.Parent = TimePopup | |
| local PopupSave = Instance.new("TextButton") | |
| PopupSave.Size = UDim2.new(0.8, 0, 0, 30); PopupSave.Position = UDim2.new(0.1, 0, 0, 80); PopupSave.BackgroundColor3 = Color3.fromRGB(0, 184, 148); PopupSave.Text = "LƯU"; PopupSave.TextColor3 = Color3.new(1,1,1); PopupSave.Font = Enum.Font.GothamBold; PopupSave.Parent = TimePopup; Instance.new("UICorner", PopupSave) | |
| -- 3. HỆ THỐNG KÉO THẢ UI CHÍNH | |
| local draggingUI, dragStartUI, startPosUI | |
| table.insert(connections, Header.InputBegan:Connect(function(input) | |
| if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then | |
| draggingUI = true; dragStartUI = input.Position; startPosUI = MainFrame.Position | |
| end | |
| end)) | |
| table.insert(connections, UserInputService.InputChanged:Connect(function(input) | |
| if draggingUI and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then | |
| local delta = input.Position - dragStartUI | |
| MainFrame.Position = UDim2.new(startPosUI.X.Scale, startPosUI.X.Offset + delta.X, startPosUI.Y.Scale, startPosUI.Y.Offset + delta.Y) | |
| end | |
| end)) | |
| table.insert(connections, UserInputService.InputEnded:Connect(function(input) | |
| if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then draggingUI = false end | |
| end)) | |
| -- HÀM TIỆN ÍCH | |
| local function isClickingOnMacroUI(clickPos) | |
| local frames = {MainFrame, TimePopup} | |
| for _, frame in ipairs(frames) do | |
| if frame.Visible then | |
| local pos, size = frame.AbsolutePosition, frame.AbsoluteSize | |
| if clickPos.X >= pos.X and clickPos.X <= (pos.X + size.X) and clickPos.Y >= pos.Y and clickPos.Y <= (pos.Y + size.Y) then | |
| return true | |
| end | |
| end | |
| end | |
| return false | |
| end | |
| local function setMode(mode) | |
| if isRunning then return end | |
| currentMode = (currentMode == mode) and "None" or mode | |
| BtnAdd.BackgroundColor3 = (currentMode == "Add") and Color3.fromRGB(162, 155, 254) or Color3.fromRGB(108, 92, 231) | |
| BtnMove.BackgroundColor3 = (currentMode == "Move") and Color3.fromRGB(250, 177, 160) or Color3.fromRGB(225, 112, 85) | |
| BtnTime.BackgroundColor3 = (currentMode == "Time") and Color3.fromRGB(116, 185, 255) or Color3.fromRGB(9, 132, 227) | |
| TimePopup.Visible = false | |
| if currentMode == "None" then | |
| StatusLabel.Text = "Trạng thái: Đang nghỉ" | |
| elseif currentMode == "Add" then | |
| StatusLabel.Text = "Trạng thái: Bấm màn hình để đặt điểm" | |
| elseif currentMode == "Move" then | |
| StatusLabel.Text = "Trạng thái: Kéo thả điểm để di chuyển" | |
| elseif currentMode == "Time" then | |
| StatusLabel.Text = "Trạng thái: Bấm vào điểm để sửa Time" | |
| end | |
| end | |
| -- 4. TẠO ĐIỂM (WAYPOINT) | |
| local function createWaypoint(x, y) | |
| if #pointsData >= MAX_CLICKS then return end | |
| local id = #pointsData + 1 | |
| local Dot = Instance.new("Frame") | |
| Dot.Size = UDim2.new(0, 34, 0, 34) | |
| Dot.Position = UDim2.new(0, x, 0, y) | |
| Dot.AnchorPoint = Vector2.new(0.5, 0.5) -- Đặt tâm vào giữa để click chuẩn | |
| Dot.BackgroundColor3 = Color3.fromRGB(255, 159, 67) | |
| Dot.BorderSizePixel = 0 | |
| Dot.ZIndex = 50 | |
| Dot.Parent = PointsFolder | |
| local DotCorner = Instance.new("UICorner") | |
| DotCorner.CornerRadius = UDim.new(1, 0) -- Hình tròn | |
| DotCorner.Parent = Dot | |
| local UIStrokeDot = Instance.new("UIStroke") | |
| UIStrokeDot.Color = Color3.new(1,1,1) | |
| UIStrokeDot.Thickness = 2 | |
| UIStrokeDot.Parent = Dot | |
| local NumLabel = Instance.new("TextLabel") | |
| NumLabel.Size = UDim2.new(1, 0, 1, 0) | |
| NumLabel.BackgroundTransparency = 1 | |
| NumLabel.Text = tostring(id) | |
| NumLabel.TextColor3 = Color3.new(1,1,1) | |
| NumLabel.Font = Enum.Font.GothamBold | |
| NumLabel.TextSize = 16 | |
| NumLabel.Parent = Dot | |
| local TimeLabel = Instance.new("TextLabel") | |
| TimeLabel.Size = UDim2.new(0, 50, 0, 20) | |
| TimeLabel.Position = UDim2.new(0.5, -25, 1, 2) | |
| TimeLabel.BackgroundTransparency = 1 | |
| TimeLabel.Text = "0.1s" | |
| TimeLabel.TextColor3 = Color3.fromRGB(85, 239, 196) | |
| TimeLabel.TextStrokeTransparency = 0 | |
| TimeLabel.Font = Enum.Font.GothamBold | |
| TimeLabel.TextSize = 12 | |
| TimeLabel.Parent = Dot | |
| local data = {id = id, frame = Dot, delay = 0.1, timeLabel = TimeLabel} | |
| table.insert(pointsData, data) | |
| -- LOGIC TƯƠNG TÁC VỚI TỪNG ĐIỂM | |
| local draggingPoint, dragStartPoint, startPosPoint | |
| Dot.InputBegan:Connect(function(input) | |
| if isRunning then return end | |
| if currentMode == "Move" and (input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch) then | |
| draggingPoint = true | |
| dragStartPoint = input.Position | |
| startPosPoint = Dot.Position | |
| elseif currentMode == "Time" and (input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch) then | |
| currentlyEditingPoint = data | |
| TimeInput.Text = tostring(data.delay) | |
| TimePopup.Visible = true | |
| end | |
| end) | |
| UserInputService.InputChanged:Connect(function(input) | |
| if draggingPoint and currentMode == "Move" and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then | |
| local delta = input.Position - dragStartPoint | |
| Dot.Position = UDim2.new(0, startPosPoint.X.Offset + delta.X, 0, startPosPoint.Y.Offset + delta.Y) | |
| end | |
| end) | |
| UserInputService.InputEnded:Connect(function(input) | |
| if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then | |
| draggingPoint = false | |
| end | |
| end) | |
| end | |
| -- LƯU THỜI GIAN | |
| PopupSave.Activated:Connect(function() | |
| if currentlyEditingPoint then | |
| local newTime = tonumber(TimeInput.Text) | |
| if newTime and newTime >= 0.01 then | |
| currentlyEditingPoint.delay = newTime | |
| currentlyEditingPoint.timeLabel.Text = tostring(newTime) .. "s" | |
| end | |
| end | |
| TimePopup.Visible = false | |
| end) | |
| -- CLICK MÀN HÌNH ĐỂ THÊM ĐIỂM | |
| table.insert(connections, UserInputService.InputBegan:Connect(function(input) | |
| if currentMode == "Add" and (input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch) then | |
| if not isClickingOnMacroUI(input.Position) then | |
| createWaypoint(input.Position.X, input.Position.Y) | |
| end | |
| end | |
| end)) | |
| -- CÁC NÚT ĐIỀU KHIỂN | |
| BtnAdd.Activated:Connect(function() setMode("Add") end) | |
| BtnMove.Activated:Connect(function() setMode("Move") end) | |
| BtnTime.Activated:Connect(function() setMode("Time") end) | |
| BtnClear.Activated:Connect(function() | |
| if isRunning then return end | |
| for _, data in ipairs(pointsData) do data.frame:Destroy() end | |
| table.clear(pointsData) | |
| setMode("None") | |
| end) | |
| BtnStart.Activated:Connect(function() | |
| if #pointsData == 0 then return end | |
| if isRunning then | |
| isRunning = false | |
| BtnStart.Text = "▶️ CHẠY MACRO" | |
| BtnStart.BackgroundColor3 = Color3.fromRGB(0, 184, 148) | |
| setMode("None") | |
| return | |
| end | |
| -- BẮT ĐẦU CHẠY | |
| isRunning = true | |
| currentMode = "Run" | |
| TimePopup.Visible = false | |
| BtnStart.Text = "⏹️ DỪNG MACRO" | |
| BtnStart.BackgroundColor3 = Color3.fromRGB(214, 48, 49) | |
| StatusLabel.Text = "Trạng thái: Đang chạy tự động..." | |
| task.spawn(function() | |
| while isRunning do | |
| for _, data in ipairs(pointsData) do | |
| if not isRunning then break end | |
| -- Đổi màu để nhận biết đang click điểm nào | |
| data.frame.BackgroundColor3 = Color3.fromRGB(255, 71, 87) | |
| -- Lấy tâm của Điểm để Click tuyệt đối (Bù Inset cho an toàn) | |
| local guiInset = GuiService:GetGuiInset() | |
| local clickX = data.frame.AbsolutePosition.X + (data.frame.AbsoluteSize.X / 2) | |
| local clickY = data.frame.AbsolutePosition.Y + (data.frame.AbsoluteSize.Y / 2) | |
| -- 1. Click Vật lý & Màn hình | |
| pcall(function() | |
| VirtualInputManager:SendMouseButtonEvent(clickX, clickY + guiInset.Y, 0, true, game, 1) | |
| task.wait(0.04) | |
| VirtualInputManager:SendMouseButtonEvent(clickX, clickY + guiInset.Y, 0, false, game, 1) | |
| end) | |
| -- 2. Ép Click UI phòng hờ | |
| pcall(function() | |
| local guiObjects = PlayerGui:GetGuiObjectsAtPosition(clickX, clickY) | |
| for _, gui in ipairs(guiObjects) do | |
| if gui:IsA("GuiButton") or gui:IsA("TextButton") or gui:IsA("ImageButton") then | |
| if getconnections then | |
| for _, conn in ipairs(getconnections(gui.Activated)) do conn:Fire() end | |
| for _, conn in ipairs(getconnections(gui.MouseButton1Click)) do conn:Fire() end | |
| end | |
| break | |
| end | |
| end | |
| end) | |
| -- Đợi đúng thời gian đã chỉnh của từng điểm | |
| task.wait(data.delay) | |
| data.frame.BackgroundColor3 = Color3.fromRGB(255, 159, 67) -- Trả màu cũ | |
| end | |
| task.wait(0.01) | |
| end | |
| end) | |
| end) | |
| CloseBtn.Activated:Connect(function() | |
| isRunning = false | |
| for _, conn in ipairs(connections) do if conn.Connected then conn:Disconnect() end end | |
| table.clear(connections) | |
| ScreenGui:Destroy() | |
| end) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment