Created
July 26, 2026 01:40
-
-
Save DuyNgao2306/42ce22e41b2a49ed831daa5a054f37d4 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 - HEAVY CLICK EDITION (UPDATED) ]] -- | |
| local Players = game:GetService("Players") | |
| local UserInputService = game:GetService("UserInputService") | |
| local VirtualInputManager = game:GetService("VirtualInputManager") | |
| local GuiService = game:GetService("GuiService") | |
| local HttpService = game:GetService("HttpService") | |
| local LocalPlayer = Players.LocalPlayer | |
| local PlayerGui = LocalPlayer:WaitForChild("PlayerGui", 10) | |
| if not PlayerGui then return end | |
| math.randomseed(os.time()) | |
| if PlayerGui:FindFirstChild("MacroSystemGui") then | |
| PlayerGui.MacroSystemGui:Destroy() | |
| end | |
| local pointsData = {} | |
| local MAX_CLICKS = 100 | |
| local currentMode = "None" | |
| 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, 310, 0, 340) | |
| MainFrame.Position = UDim2.new(0.5, -155, 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 v2" | |
| 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 | |
| local BtnContainer = Instance.new("Frame") | |
| BtnContainer.Size = UDim2.new(1, -24, 1, -85) | |
| 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, 8) | |
| 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", "⏱️ Sửa Time", Color3.fromRGB(9, 132, 227), 3) | |
| local BtnDelOne = createButton("BtnDelOne", "❌ Xóa 1 Điểm", Color3.fromRGB(214, 48, 49), 4) | |
| local BtnSave = createButton("BtnSave", "💾 Lưu Script", Color3.fromRGB(0, 206, 201), 5) | |
| local BtnClear = createButton("BtnClear", "🗑️ Xóa Tất Cả", Color3.fromRGB(116, 125, 140), 6) | |
| local BtnStart = createButton("BtnStart", "▶️ CHẠY MACRO", Color3.fromRGB(0, 184, 148), 7) | |
| BtnStart.Size = UDim2.new(1, 0, 0, 42) | |
| 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)) | |
| 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) | |
| BtnDelOne.BackgroundColor3 = (currentMode == "DeleteOne") and Color3.fromRGB(255, 107, 107) or Color3.fromRGB(214, 48, 49) | |
| 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" | |
| elseif currentMode == "DeleteOne" then StatusLabel.Text = "Trạng thái: Bấm vào điểm để XÓA" end | |
| end | |
| -- Cập nhật lại số thứ tự (ID) các điểm khi có thay đổi | |
| local function refreshWaypointIndices() | |
| for index, data in ipairs(pointsData) do | |
| data.id = index | |
| if data.numLabel then | |
| data.numLabel.Text = tostring(index) | |
| end | |
| end | |
| end | |
| -- 4. TẠO ĐIỂM (WAYPOINT) | |
| local function createWaypoint(x, y, customDelay) | |
| if #pointsData >= MAX_CLICKS then return end | |
| local id = #pointsData + 1 | |
| local pointDelay = customDelay or 0.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) | |
| Dot.BackgroundColor3 = Color3.fromRGB(255, 159, 67) | |
| Dot.BorderSizePixel = 0 | |
| Dot.ZIndex = 50 | |
| Dot.Parent = PointsFolder | |
| Instance.new("UICorner", Dot).CornerRadius = UDim.new(1, 0) | |
| 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 = tostring(pointDelay).."s"; TimeLabel.TextColor3 = Color3.fromRGB(85, 239, 196); TimeLabel.Font = Enum.Font.GothamBold; TimeLabel.TextSize = 12; TimeLabel.Parent = Dot | |
| local data = {id = id, frame = Dot, delay = pointDelay, timeLabel = TimeLabel, numLabel = NumLabel, absX = x, absY = y} | |
| table.insert(pointsData, data) | |
| 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 | |
| elseif currentMode == "DeleteOne" and (input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch) then | |
| -- Xóa đúng điểm này | |
| Dot:Destroy() | |
| for i, v in ipairs(pointsData) do | |
| if v == data then | |
| table.remove(pointsData, i) | |
| break | |
| end | |
| end | |
| refreshWaypointIndices() | |
| 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) | |
| data.absX = startPosPoint.X.Offset + delta.X | |
| data.absY = 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 | |
| data.absX = Dot.AbsolutePosition.X + (Dot.AbsoluteSize.X / 2) | |
| data.absY = Dot.AbsolutePosition.Y + (Dot.AbsoluteSize.Y / 2) | |
| end | |
| end) | |
| end | |
| 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) | |
| 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)) | |
| BtnAdd.Activated:Connect(function() setMode("Add") end) | |
| BtnMove.Activated:Connect(function() setMode("Move") end) | |
| BtnTime.Activated:Connect(function() setMode("Time") end) | |
| BtnDelOne.Activated:Connect(function() setMode("DeleteOne") end) | |
| -- CHỨC NĂNG LƯU SCRIPT (EXPORT RA CONSOLE / PRINT) | |
| BtnSave.Activated:Connect(function() | |
| if #pointsData == 0 then | |
| StatusLabel.Text = "Trạng thái: Không có điểm để lưu!" | |
| task.delay(2, function() if not isRunning then StatusLabel.Text = "Trạng thái: Đang nghỉ" end end) | |
| return | |
| end | |
| local exportTable = {} | |
| for _, data in ipairs(pointsData) do | |
| local posX = data.frame.AbsolutePosition.X + (data.frame.AbsoluteSize.X / 2) | |
| local posY = data.frame.AbsolutePosition.Y + (data.frame.AbsoluteSize.Y / 2) | |
| table.insert(exportTable, {x = posX, y = posY, delay = data.delay}) | |
| end | |
| pcall(function() | |
| local jsonString = HttpService:JSONEncode(exportTable) | |
| print("=== MACRO SCRIPT SAVED DATA ===") | |
| print(jsonString) | |
| print("================================") | |
| end) | |
| StatusLabel.Text = "Trạng thái: Đã lưu Script vào F9 (Console)!" | |
| task.delay(3, function() if not isRunning then StatusLabel.Text = "Trạng thái: Đang nghỉ" end end) | |
| 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) | |
| -- 5. THỰC THI CHẠY MACRO (Đã tinh chỉnh thời gian chuẩn xác) | |
| 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 | |
| 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 | |
| data.frame.BackgroundColor3 = Color3.fromRGB(255, 71, 87) | |
| 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Ý | |
| pcall(function() | |
| VirtualInputManager:SendMouseButtonEvent(clickX, clickY + guiInset.Y, 0, true, game, 1) | |
| VirtualInputManager:SendTouchEvent(data.id, 0, clickX, clickY + guiInset.Y) | |
| task.wait(0.05) -- Giữ chuột ngắn gọn để không bị kẹt thời gian | |
| VirtualInputManager:SendMouseButtonEvent(clickX, clickY + guiInset.Y, 0, false, game, 1) | |
| VirtualInputManager:SendTouchEvent(data.id, 2, clickX, clickY + guiInset.Y) | |
| end) | |
| -- 2. XUYÊN THỦNG GIAO DIỆN UI | |
| 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.MouseButton1Down)) do conn:Fire() end | |
| for _, conn in ipairs(getconnections(gui.Activated)) do conn:Fire() end | |
| for _, conn in ipairs(getconnections(gui.TouchTap)) do conn:Fire() end | |
| for _, conn in ipairs(getconnections(gui.MouseButton1Click)) do conn:Fire() end | |
| for _, conn in ipairs(getconnections(gui.MouseButton1Up)) do conn:Fire() end | |
| end | |
| break | |
| end | |
| end | |
| end) | |
| data.frame.BackgroundColor3 = Color3.fromRGB(255, 159, 67) | |
| -- Chờ chính xác thời gian trễ đã cài đặt (trừ đi khoảng thời gian thực thi nhỏ) | |
| local waitTime = math.max(0.01, data.delay) | |
| task.wait(waitTime) | |
| 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