Created
July 24, 2026 14:55
-
-
Save DuyNgao2306/655b6fa724225578fd042d5229fb85cf 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 - NATIVE ROBLOX STUDIO VERSION ]] -- | |
| local Players = game:GetService("Players") | |
| local UserInputService = game:GetService("UserInputService") | |
| local LocalPlayer = Players.LocalPlayer | |
| local PlayerGui = LocalPlayer:WaitForChild("PlayerGui") | |
| -- Dọn dẹp UI cũ nếu tồn tại | |
| 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 (MODERN DARK THEME) | |
| 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, 220) | |
| 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 (STUDIO)" | |
| 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 | |
| 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 | |
| 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 | |
| local SelectBtn = createButton("SelectBtn", "Start selecting", UDim2.new(0, 12, 0, 98), UDim2.new(1, -24, 0, 34), Color3.fromRGB(108, 92, 231)) | |
| local StartBtn = createButton("StartBtn", "Starts", UDim2.new(0, 12, 0, 140), UDim2.new(0, 175, 0, 34), Color3.fromRGB(0, 184, 148)) | |
| local ClearBtn = createButton("ClearBtn", "Xóa", UDim2.new(0, 195, 0, 140), 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)) | |
| -- Lọc click rơi vào khung bảng Macro | |
| 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 & PHÁT LẠI HÀNH ĐỘNG | |
| local function stopRunning() | |
| isRunning = false | |
| StartBtn.Text = "Starts" | |
| 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 = "Start selecting" | |
| 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 | |
| -- Ghi nhận vị trí và đối tượng UI/Tool | |
| 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 | |
| -- Tìm nút UI tại điểm vừa click | |
| local posVector = Vector2.new(input.Position.X, input.Position.Y) | |
| local guiObjects = PlayerGui:GetGuiObjectsAtPosition(posVector.X, posVector.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 | |
| table.insert(recordedClicks, { | |
| button = targetButton, | |
| delay = delayTime | |
| }) | |
| CountLabel.Text = "Đã lưu: " .. #recordedClicks .. " / " .. MAX_CLICKS | |
| StatusLabel.Text = targetButton and ("Đã lưu nút UI: " .. targetButton.Name) or "Đã lưu lượt click!" | |
| 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 = "Stop selecting" | |
| SelectBtn.BackgroundColor3 = Color3.fromRGB(225, 112, 85) | |
| StatusLabel.Text = "Trạng thái: Hãy click các nút trong game..." | |
| 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 = "Stop Macro" | |
| StartBtn.BackgroundColor3 = Color3.fromRGB(214, 48, 49) | |
| StatusLabel.Text = "Trạng thái: Đang phát lại..." | |
| StatusLabel.TextColor3 = Color3.fromRGB(85, 239, 196) | |
| -- Vòng lặp phát lại hành động mượt mà | |
| task.spawn(function() | |
| while isRunning do | |
| for _, data in ipairs(recordedClicks) do | |
| if not isRunning then break end | |
| task.wait(data.delay) | |
| if not isRunning then break end | |
| -- 1. Nếu click trúng nút UI trong game -> Kích hoạt nút đó | |
| if data.button and data.button.Parent then | |
| pcall(function() | |
| if getconnections then | |
| for _, conn in ipairs(getconnections(data.button.Activated)) do | |
| conn:Fire() | |
| end | |
| end | |
| end) | |
| end | |
| -- 2. Tự động Activate Tool nếu người chơi đang cầm công cụ trong game | |
| local character = LocalPlayer.Character | |
| if character then | |
| local tool = character:FindFirstChildOfClass("Tool") | |
| if tool then | |
| tool:Activate() | |
| end | |
| end | |
| end | |
| task.wait(0.05) | |
| 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 | |
| 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