Skip to content

Instantly share code, notes, and snippets.

@DuyNgao2306
Created July 26, 2026 00:05
Show Gist options
  • Select an option

  • Save DuyNgao2306/98905902b747c314af5f826ed5423a23 to your computer and use it in GitHub Desktop.

Select an option

Save DuyNgao2306/98905902b747c314af5f826ed5423a23 to your computer and use it in GitHub Desktop.
-- [[ VISUAL AUTO CLICKER - ULTIMATE PERFECTED EDITION ]] --
local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local VirtualInputManager = game:GetService("VirtualInputManager")
-- Đã xóa GuiService thừa
local LocalPlayer = Players.LocalPlayer
local PlayerGui = LocalPlayer:WaitForChild("PlayerGui")
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
-- Biến quản lý kéo thả chung toàn cục
local activeDraggingData = nil
local dragStartPoint, startPosPoint
-- 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.IgnoreGuiInset = true
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
Instance.new("UICorner", Header).CornerRadius = UDim.new(0, 10)
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 = "✨ PERFECTED 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.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, -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.new(1,1,1); btn.Font = Enum.Font.GothamBold; btn.TextSize = 12; btn.LayoutOrder = order; btn.Parent = BtnContainer
Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 6)
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)
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
Instance.new("UICorner", TimePopup).CornerRadius = UDim.new(0, 10)
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 UI KÉO THẢ CHUNG
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
if activeDraggingData and currentMode == "Move" and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
local delta = input.Position - dragStartPoint
activeDraggingData.frame.Position = UDim2.new(0, startPosPoint.X.Offset + delta.X, 0, startPosPoint.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
if activeDraggingData then
activeDraggingData.isDragging = false
activeDraggingData = nil
end
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)
TimePopup.Visible = false
currentlyEditingPoint = nil -- Reset khi đổi mode
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 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)
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 = "0.1s"; TimeLabel.TextColor3 = Color3.fromRGB(85, 239, 196); TimeLabel.Font = Enum.Font.GothamBold; TimeLabel.TextSize = 12; TimeLabel.TextStrokeTransparency = 0; TimeLabel.Parent = Dot
local data = { id = id, frame = Dot, delay = 0.1, timeLabel = TimeLabel, isDragging = false }
table.insert(pointsData, data)
table.insert(connections, 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
activeDraggingData = data
data.isDragging = 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))
end
table.insert(connections, 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
currentlyEditingPoint = nil -- Đã reset data sau khi lưu
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))
table.insert(connections, BtnAdd.Activated:Connect(function() setMode("Add") end))
table.insert(connections, BtnMove.Activated:Connect(function() setMode("Move") end))
table.insert(connections, BtnTime.Activated:Connect(function() setMode("Time") end))
table.insert(connections, 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))
-- KHỞI ĐỘNG CHUỖI MACRO VỚI HEAVY CLICK
table.insert(connections, 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; currentlyEditingPoint = nil
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 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Ý HẠNG NẶNG
pcall(function()
VirtualInputManager:SendMouseButtonEvent(clickX, clickY, 0, true, game, 1)
VirtualInputManager:SendTouchEvent(data.id, 0, clickX, clickY)
task.wait(0.08)
VirtualInputManager:SendMouseButtonEvent(clickX, clickY, 0, false, game, 1)
VirtualInputManager:SendTouchEvent(data.id, 2, clickX, clickY)
end)
-- 2. ÉP CLICK XUYÊN THỦNG UI
pcall(function()
local guiObjects = PlayerGui:GetGuiObjectsAtPosition(clickX, clickY)
for _, gui in ipairs(guiObjects) do
-- Kiểm tra gọn gàng bằng tính kế thừa OOP
if gui:IsA("GuiButton") 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)
task.wait(data.delay)
data.frame.BackgroundColor3 = Color3.fromRGB(255, 159, 67)
end
task.wait(0.01)
end
end)
end))
table.insert(connections, 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