Created
July 24, 2026 15:09
-
-
Save DuyNgao2306/ed1a36067d0fb584eb3db21f564e13ab 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
| -- [[ SMART MACRO - DYNAMIC CLICK & RUN TIMER VERSION ]] -- | |
| local Players = game:GetService("Players") | |
| local UserInputService = game:GetService("UserInputService") | |
| local VirtualInputManager = game:GetService("VirtualInputManager") | |
| local LocalPlayer = Players.LocalPlayer | |
| local PlayerGui = LocalPlayer:WaitForChild("PlayerGui") | |
| math.randomseed(os.time()) | |
| if PlayerGui:FindFirstChild("MacroSystemGui") then | |
| PlayerGui.MacroSystemGui:Destroy() | |
| end | |
| local recordedClicks = {} | |
| local MAX_CLICKS = 200 | |
| local isSelecting = false | |
| local isRunning = false | |
| local lastClickTime = 0 | |
| local connections = {} | |
| -- 1. TẠO GIAO DIỆN UI (MỞ RỘNG ĐỂ CHỨA ĐỒNG HỒ) | |
| local ScreenGui = Instance.new("ScreenGui") | |
| ScreenGui.Name = "MacroSystemGui" | |
| ScreenGui.ResetOnSpawn = false | |
| ScreenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling | |
| ScreenGui.DisplayOrder = 999 | |
| ScreenGui.Parent = PlayerGui | |
| local MainFrame = Instance.new("Frame") | |
| MainFrame.Name = "MainFrame" | |
| MainFrame.Size = UDim2.new(0, 300, 0, 250) -- Kéo dài frame thêm 1 chút | |
| 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 = "🛡️ SMART MACRO (PRO)" | |
| Title.TextColor3 = Color3.fromRGB(255, 255, 255) | |
| Title.TextSize = 13 | |
| 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 | |
| -- NHÃN HIỂN THỊ TRẠNG THÁI | |
| local StatusLabel = Instance.new("TextLabel") | |
| StatusLabel.Size = UDim2.new(1, -24, 0, 20) | |
| StatusLabel.Position = UDim2.new(0, 12, 0, 48) | |
| StatusLabel.BackgroundTransparency = 1 | |
| StatusLabel.Text = "Trạng thái: Đang nghỉ" | |
| StatusLabel.TextColor3 = Color3.fromRGB(180, 185, 200) | |
| StatusLabel.TextSize = 12 | |
| StatusLabel.Font = Enum.Font.GothamMedium | |
| StatusLabel.TextXAlignment = Enum.TextXAlignment.Left | |
| StatusLabel.Parent = MainFrame | |
| local CountLabel = Instance.new("TextLabel") | |
| CountLabel.Size = UDim2.new(1, -24, 0, 20) | |
| CountLabel.Position = UDim2.new(0, 12, 0, 68) | |
| CountLabel.BackgroundTransparency = 1 | |
| CountLabel.Text = "Đã lưu: 0 / " .. MAX_CLICKS | |
| CountLabel.TextColor3 = Color3.fromRGB(130, 135, 150) | |
| CountLabel.TextSize = 11 | |
| CountLabel.Font = Enum.Font.Gotham | |
| CountLabel.TextXAlignment = Enum.TextXAlignment.Left | |
| CountLabel.Parent = MainFrame | |
| -- NHÃN HIỂN THỊ ĐỒNG HỒ THỜI GIAN CHẠY (MỚI) | |
| local TimerLabel = Instance.new("TextLabel") | |
| TimerLabel.Size = UDim2.new(1, -24, 0, 20) | |
| TimerLabel.Position = UDim2.new(0, 12, 0, 88) | |
| TimerLabel.BackgroundTransparency = 1 | |
| TimerLabel.Text = "⏱️ Thời gian chạy: 00:00:00" | |
| TimerLabel.TextColor3 = Color3.fromRGB(85, 239, 196) | |
| TimerLabel.TextSize = 12 | |
| TimerLabel.Font = Enum.Font.GothamBold | |
| TimerLabel.TextXAlignment = Enum.TextXAlignment.Left | |
| TimerLabel.Parent = MainFrame | |
| local function createButton(name, text, pos, size, color) | |
| local btn = Instance.new("TextButton") | |
| btn.Name = name | |
| btn.Size = size | |
| btn.Position = pos | |
| btn.BackgroundColor3 = color | |
| btn.Text = text | |
| btn.TextColor3 = Color3.fromRGB(255, 255, 255) | |
| btn.Font = Enum.Font.GothamBold | |
| btn.TextSize = 13 | |
| btn.ZIndex = 10 | |
| btn.Parent = MainFrame | |
| local corner = Instance.new("UICorner") | |
| corner.CornerRadius = UDim.new(0, 8) | |
| corner.Parent = btn | |
| return btn | |
| end | |
| -- Di chuyển các nút xuống một chút để nhường chỗ cho Đồng hồ | |
| local SelectBtn = createButton("SelectBtn", "Bắt đầu chọn", UDim2.new(0, 12, 0, 118), UDim2.new(1, -24, 0, 34), Color3.fromRGB(108, 92, 231)) | |
| local StartBtn = createButton("StartBtn", "Chạy Macro", UDim2.new(0, 12, 0, 160), UDim2.new(0, 175, 0, 34), Color3.fromRGB(0, 184, 148)) | |
| local ClearBtn = createButton("ClearBtn", "Xóa", UDim2.new(0, 195, 0, 160), UDim2.new(0, 93, 0, 34), Color3.fromRGB(225, 112, 85)) | |
| local function bindClick(button, callback) | |
| table.insert(connections, button.Activated:Connect(callback)) | |
| end | |
| -- 2. KÉO THẢ UI | |
| local dragging, dragStart, startPos | |
| table.insert(connections, Header.InputBegan:Connect(function(input) | |
| if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then | |
| dragging = true | |
| dragStart = input.Position | |
| startPos = MainFrame.Position | |
| end | |
| end)) | |
| table.insert(connections, UserInputService.InputChanged:Connect(function(input) | |
| if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then | |
| local delta = input.Position - dragStart | |
| MainFrame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.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 | |
| dragging = false | |
| end | |
| end)) | |
| local function isClickingOnMacroUI(clickPos) | |
| local framePos = MainFrame.AbsolutePosition | |
| local frameSize = MainFrame.AbsoluteSize | |
| return clickPos.X >= framePos.X and clickPos.X <= (framePos.X + frameSize.X) and | |
| clickPos.Y >= framePos.Y and clickPos.Y <= (framePos.Y + frameSize.Y) | |
| end | |
| -- 3. LOGIC GHI NHẬN & CHỐNG BAN (Sửa lỗi hụt click) | |
| local function stopRunning() | |
| isRunning = false | |
| StartBtn.Text = "Chạy Macro" | |
| StartBtn.BackgroundColor3 = Color3.fromRGB(0, 184, 148) | |
| StatusLabel.Text = "Trạng thái: Đã dừng" | |
| StatusLabel.TextColor3 = Color3.fromRGB(180, 185, 200) | |
| end | |
| local function stopSelecting() | |
| isSelecting = false | |
| SelectBtn.Text = "Bắt đầu chọn" | |
| SelectBtn.BackgroundColor3 = Color3.fromRGB(108, 92, 231) | |
| StatusLabel.Text = "Trạng thái: Hoàn tất chọn" | |
| StatusLabel.TextColor3 = Color3.fromRGB(180, 185, 200) | |
| end | |
| -- LƯU LẠI TỌA ĐỘ THAY VÌ LƯU CỨNG OBJECT | |
| table.insert(connections, UserInputService.InputBegan:Connect(function(input) | |
| if not isSelecting then return end | |
| if isClickingOnMacroUI(input.Position) then return end | |
| if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then | |
| if #recordedClicks >= MAX_CLICKS then | |
| StatusLabel.Text = "Lỗi: Đạt giới hạn " .. MAX_CLICKS .. " điểm!" | |
| StatusLabel.TextColor3 = Color3.fromRGB(255, 118, 117) | |
| return | |
| end | |
| local now = os.clock() | |
| local delayTime = (#recordedClicks > 0) and math.max(now - lastClickTime, 0.05) or 0.1 | |
| lastClickTime = now | |
| -- LƯU CHÍNH XÁC TỌA ĐỘ X, Y (Khắc phục lỗi mất nút) | |
| table.insert(recordedClicks, { | |
| x = input.Position.X, | |
| y = input.Position.Y, | |
| delay = delayTime | |
| }) | |
| CountLabel.Text = "Đã lưu: " .. #recordedClicks .. " / " .. MAX_CLICKS | |
| StatusLabel.Text = "Ghi tọa độ: X:" .. math.floor(input.Position.X) .. " Y:" .. math.floor(input.Position.Y) .. " (Trễ " .. string.format("%.2f", delayTime) .. "s)" | |
| StatusLabel.TextColor3 = Color3.fromRGB(253, 203, 110) | |
| end | |
| end)) | |
| -- SỰ KIỆN CÁC NÚT BẤM | |
| bindClick(SelectBtn, function() | |
| if isRunning then stopRunning() end | |
| isSelecting = not isSelecting | |
| if isSelecting then | |
| SelectBtn.Text = "Dừng chọn" | |
| SelectBtn.BackgroundColor3 = Color3.fromRGB(225, 112, 85) | |
| StatusLabel.Text = "Trạng thái: Đang thu thập khoảng cách click..." | |
| StatusLabel.TextColor3 = Color3.fromRGB(253, 203, 110) | |
| lastClickTime = os.clock() | |
| else | |
| stopSelecting() | |
| end | |
| end) | |
| bindClick(StartBtn, function() | |
| if isSelecting then stopSelecting() end | |
| if isRunning then stopRunning(); return end | |
| if #recordedClicks == 0 then | |
| StatusLabel.Text = "Lỗi: Chưa lưu điểm click nào!" | |
| StatusLabel.TextColor3 = Color3.fromRGB(255, 118, 117) | |
| return | |
| end | |
| isRunning = true | |
| StartBtn.Text = "Dừng Macro" | |
| StartBtn.BackgroundColor3 = Color3.fromRGB(214, 48, 49) | |
| StatusLabel.Text = "Trạng thái: Đang chạy & Tránh Ban..." | |
| StatusLabel.TextColor3 = Color3.fromRGB(85, 239, 196) | |
| -- LUỒNG 1: ĐỒNG HỒ ĐẾM THỜI GIAN ĐẸP MẮT | |
| local startTime = os.time() | |
| task.spawn(function() | |
| while isRunning do | |
| local elapsed = os.time() - startTime | |
| local hours = math.floor(elapsed / 3600) | |
| local minutes = math.floor((elapsed % 3600) / 60) | |
| local seconds = elapsed % 60 | |
| TimerLabel.Text = string.format("⏱️ Thời gian chạy: %02d:%02d:%02d", hours, minutes, seconds) | |
| task.wait(1) | |
| end | |
| end) | |
| -- LUỒNG 2: VÒNG LẶP CLICK & TỰ ĐỘNG TÌM NÚT MỚI | |
| task.spawn(function() | |
| while isRunning do | |
| for _, data in ipairs(recordedClicks) do | |
| if not isRunning then break end | |
| -- Jitter Chống Ban | |
| local randomJitter = math.random(-15, 30) / 1000 | |
| local safeWait = math.max(data.delay + randomJitter, 0.05) | |
| task.wait(safeWait) | |
| if not isRunning then break end | |
| -- CÁCH 1: Tìm lại nút UI ngay tại Tọa Độ đó (Fix lỗi hụt click) | |
| local guiObjects = PlayerGui:GetGuiObjectsAtPosition(data.x, data.y) | |
| local targetButton = nil | |
| for _, gui in ipairs(guiObjects) do | |
| if not gui:IsDescendantOf(ScreenGui) and (gui:IsA("TextButton") or gui:IsA("ImageButton")) then | |
| targetButton = gui | |
| break | |
| end | |
| end | |
| -- Nếu tìm thấy UI, kích hoạt nó | |
| if targetButton and targetButton.Parent then | |
| pcall(function() | |
| if getconnections then | |
| for _, conn in ipairs(getconnections(targetButton.Activated)) do | |
| conn:Fire() | |
| end | |
| end | |
| end) | |
| end | |
| -- CÁCH 2: Giả lập click chuột thực tế (Giúp click vào 3D trong game) | |
| pcall(function() | |
| VirtualInputManager:SendMouseButtonEvent(data.x, data.y, 0, true, game, 1) | |
| task.wait(0.01) | |
| VirtualInputManager:SendMouseButtonEvent(data.x, data.y, 0, false, game, 1) | |
| end) | |
| -- CÁCH 3: Tự động Activate Tool nếu đang cầm | |
| local character = LocalPlayer.Character | |
| if character then | |
| local tool = character:FindFirstChildOfClass("Tool") | |
| if tool then | |
| tool:Activate() | |
| end | |
| end | |
| end | |
| task.wait(math.random(5, 15) / 100) | |
| end | |
| end) | |
| end) | |
| bindClick(ClearBtn, function() | |
| if isRunning then stopRunning() end | |
| if isSelecting then stopSelecting() end | |
| table.clear(recordedClicks) | |
| CountLabel.Text = "Đã lưu: 0 / " .. MAX_CLICKS | |
| TimerLabel.Text = "⏱️ Thời gian chạy: 00:00:00" | |
| StatusLabel.Text = "Trạng thái: Đã xóa toàn bộ" | |
| StatusLabel.TextColor3 = Color3.fromRGB(180, 185, 200) | |
| end) | |
| bindClick(CloseBtn, function() | |
| isRunning = false | |
| isSelecting = 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