Skip to content

Instantly share code, notes, and snippets.

@DuyNgao2306
Created July 26, 2026 01:40
Show Gist options
  • Select an option

  • Save DuyNgao2306/42ce22e41b2a49ed831daa5a054f37d4 to your computer and use it in GitHub Desktop.

Select an option

Save DuyNgao2306/42ce22e41b2a49ed831daa5a054f37d4 to your computer and use it in GitHub Desktop.
-- [[ 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