Skip to content

Instantly share code, notes, and snippets.

@DuyNgao2306
Created July 26, 2026 02:42
Show Gist options
  • Select an option

  • Save DuyNgao2306/27f0b9994b83c6bf0e01f611fb725bfb to your computer and use it in GitHub Desktop.

Select an option

Save DuyNgao2306/27f0b9994b83c6bf0e01f611fb725bfb to your computer and use it in GitHub Desktop.
-- [[ VISUAL AUTO CLICKER - HEAVY CLICK EDITION (V0.1 - JSON DATA STORE 5 SLOTS) ]] --
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 isMinimized = false
local connections = {}
local currentlyEditingPoint = nil
-- FOLDER SETUP FOR PERSISTENT DATA STORE
local folderName = "VisualMacroSlots"
pcall(function()
if not isfolder(folderName) then
makefolder(folderName)
end
end)
-- 1. MAIN GUI CREATION
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, 480)
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, -80, 1, 0)
Title.Position = UDim2.new(0, 12, 0, 0)
Title.BackgroundTransparency = 1
Title.Text = "✨ VISUAL AUTO CLICKER V0.1"
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 = 16
CloseBtn.Font = Enum.Font.GothamBold
CloseBtn.ZIndex = 10
CloseBtn.Parent = Header
local MinimizeBtn = Instance.new("TextButton")
MinimizeBtn.Size = UDim2.new(0, 30, 0, 30)
MinimizeBtn.Position = UDim2.new(1, -38, 0.5, 0)
MinimizeBtn.AnchorPoint = Vector2.new(1, 0.5)
MinimizeBtn.BackgroundTransparency = 1
MinimizeBtn.Text = "🗕"
MinimizeBtn.TextColor3 = Color3.fromRGB(255, 234, 167)
MinimizeBtn.TextSize = 16
MinimizeBtn.Font = Enum.Font.GothamBold
MinimizeBtn.ZIndex = 10
MinimizeBtn.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 = "Status: Resting"
StatusLabel.TextColor3 = Color3.fromRGB(180, 185, 200)
StatusLabel.TextSize = 13
StatusLabel.Font = Enum.Font.GothamMedium
StatusLabel.TextXAlignment = Enum.TextXAlignment.Left
StatusLabel.Parent = MainFrame
-- JSON INBOX FOR EASY COPYING (MOBILE & PC)
local JsonInbox = Instance.new("TextBox")
JsonInbox.Name = "JsonInbox"
JsonInbox.Size = UDim2.new(1, -24, 0, 45)
JsonInbox.Position = UDim2.new(0, 12, 0, 70)
JsonInbox.BackgroundColor3 = Color3.fromRGB(20, 22, 30)
JsonInbox.TextColor3 = Color3.fromRGB(120, 224, 143)
JsonInbox.TextSize = 10
JsonInbox.Font = Enum.Font.Code
JsonInbox.Text = ""
JsonInbox.PlaceholderText = "Saved JSON Inbox (Tap/Click to copy)..."
JsonInbox.ClearTextOnFocus = false
JsonInbox.TextEditable = true
JsonInbox.MultiLine = true
JsonInbox.TextWrapped = true
JsonInbox.Parent = MainFrame
Instance.new("UICorner", JsonInbox).CornerRadius = UDim.new(0, 6)
local InboxStroke = Instance.new("UIStroke")
InboxStroke.Color = Color3.fromRGB(50, 55, 75)
InboxStroke.Thickness = 1
InboxStroke.Parent = JsonInbox
local BtnContainer = Instance.new("Frame")
BtnContainer.Size = UDim2.new(1, -24, 1, -170)
BtnContainer.Position = UDim2.new(0, 12, 0, 122)
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", "➕ Add Point", Color3.fromRGB(108, 92, 231), 1)
local BtnMove = createButton("BtnMove", "🖐️ Move Point", Color3.fromRGB(225, 112, 85), 2)
local BtnTime = createButton("BtnTime", "⏱️ Edit Time", Color3.fromRGB(9, 132, 227), 3)
local BtnDelOne = createButton("BtnDelOne", "❌ Delete One", Color3.fromRGB(214, 48, 49), 4)
local BtnSave = createButton("BtnSave", "💾 Save Script", Color3.fromRGB(0, 206, 201), 5)
local BtnLoad = createButton("BtnLoad", "📥 Load Script", Color3.fromRGB(46, 204, 113), 6)
local BtnDataStore = createButton("BtnDataStore", "📦 Data Store", Color3.fromRGB(238, 82, 83), 7)
local BtnClear = createButton("BtnClear", "🗑️ Clear All", Color3.fromRGB(116, 125, 140), 8)
local BtnStart = createButton("BtnStart", "▶️ START MACRO", Color3.fromRGB(0, 184, 148), 9)
BtnStart.Size = UDim2.new(1, 0, 0, 40)
GridLayout.FillDirectionMaxCells = 2
-- 2. TIME POPUP DIALOG
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 = "Enter delay time (sec):" ; 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 = "SAVE"; PopupSave.TextColor3 = Color3.new(1,1,1); PopupSave.Font = Enum.Font.GothamBold; PopupSave.Parent = TimePopup; Instance.new("UICorner", PopupSave)
-- 2.1. LOAD SCRIPT POPUP DIALOG
local LoadPopup = Instance.new("Frame")
LoadPopup.Size = UDim2.new(0, 240, 0, 150)
LoadPopup.Position = UDim2.new(0.5, 0, 0.5, 0)
LoadPopup.AnchorPoint = Vector2.new(0.5, 0.5)
LoadPopup.BackgroundColor3 = Color3.fromRGB(45, 52, 54)
LoadPopup.Visible = false
LoadPopup.ZIndex = 50
LoadPopup.Parent = ScreenGui
local LoadPopupCorner = Instance.new("UICorner"); LoadPopupCorner.CornerRadius = UDim.new(0, 10); LoadPopupCorner.Parent = LoadPopup
local LoadPopupLabel = Instance.new("TextLabel")
LoadPopupLabel.Size = UDim2.new(1, 0, 0, 30); LoadPopupLabel.Position = UDim2.new(0, 0, 0, 10); LoadPopupLabel.BackgroundTransparency = 1
LoadPopupLabel.Text = "Paste JSON Script here:"; LoadPopupLabel.TextColor3 = Color3.new(1,1,1); LoadPopupLabel.Font = Enum.Font.GothamBold; LoadPopupLabel.TextSize = 12; LoadPopupLabel.Parent = LoadPopup
local LoadInput = Instance.new("TextBox")
LoadInput.Size = UDim2.new(0.85, 0, 0, 45); LoadInput.Position = UDim2.new(0.075, 0, 0, 45); LoadInput.BackgroundColor3 = Color3.fromRGB(20,20,20); LoadInput.TextColor3 = Color3.new(1,1,1)
LoadInput.Text = ""; LoadInput.PlaceholderText = "Paste JSON string here..."; LoadInput.Font = Enum.Font.GothamMedium; LoadInput.TextSize = 10; LoadInput.ClearTextOnFocus = false; LoadInput.Parent = LoadPopup
Instance.new("UICorner", LoadInput).CornerRadius = UDim.new(0, 6)
local PopupLoadBtn = Instance.new("TextButton")
PopupLoadBtn.Size = UDim2.new(0.85, 0, 0, 30); PopupLoadBtn.Position = UDim2.new(0.075, 0, 0, 100); PopupLoadBtn.BackgroundColor3 = Color3.fromRGB(46, 204, 113)
PopupLoadBtn.Text = "CONFIRM LOAD"; PopupLoadBtn.TextColor3 = Color3.new(1,1,1); PopupLoadBtn.Font = Enum.Font.GothamBold; PopupLoadBtn.TextSize = 12; PopupLoadBtn.Parent = LoadPopup
Instance.new("UICorner", PopupLoadBtn).CornerRadius = UDim.new(0, 6)
-- 2.2. JSON DATA STORE POPUP (5 SLOTS)
local DataStorePopup = Instance.new("Frame")
DataStorePopup.Size = UDim2.new(0, 270, 0, 260)
DataStorePopup.Position = UDim2.new(0.5, 0, 0.5, 0)
DataStorePopup.AnchorPoint = Vector2.new(0.5, 0.5)
DataStorePopup.BackgroundColor3 = Color3.fromRGB(35, 38, 52)
DataStorePopup.Visible = false
DataStorePopup.ZIndex = 60
DataStorePopup.Parent = ScreenGui
Instance.new("UICorner", DataStorePopup).CornerRadius = UDim.new(0, 10)
Instance.new("UIStroke", DataStorePopup).Color = Color3.fromRGB(80, 90, 120)
local DSHeader = Instance.new("TextLabel")
DSHeader.Size = UDim2.new(1, 0, 0, 35)
DSHeader.BackgroundTransparency = 1
DSHeader.Text = "📦 JSON Data Store (5 Slots)"
DSHeader.TextColor3 = Color3.fromRGB(255, 255, 255)
DSHeader.Font = Enum.Font.GothamBold
DSHeader.TextSize = 12
DSHeader.Parent = DataStorePopup
local DSCloseBtn = Instance.new("TextButton")
DSCloseBtn.Size = UDim2.new(0, 30, 0, 30)
DSCloseBtn.Position = UDim2.new(1, -5, 0, 2)
DSCloseBtn.BackgroundTransparency = 1
DSCloseBtn.Text = "✕"
DSCloseBtn.TextColor3 = Color3.fromRGB(255, 71, 87)
DSCloseBtn.TextSize = 14
DSCloseBtn.Font = Enum.Font.GothamBold
DSCloseBtn.Parent = DataStorePopup
local SlotContainer = Instance.new("ScrollingFrame")
SlotContainer.Size = UDim2.new(1, -16, 1, -45)
SlotContainer.Position = UDim2.new(0, 8, 0, 38)
SlotContainer.BackgroundTransparency = 1
SlotContainer.BorderSizePixel = 0
SlotContainer.CanvasSize = UDim2.new(0, 0, 0, 5 * 40 + 10)
SlotContainer.ScrollBarThickness = 4
SlotContainer.Parent = DataStorePopup
local UIListLayout = Instance.new("UIListLayout")
UIListLayout.SortOrder = Enum.SortOrder.LayoutOrder
UIListLayout.Padding = UDim.new(0, 6)
UIListLayout.Parent = SlotContainer
local slotRows = {}
local function getSlotFilePath(slotIndex)
return folderName .. "/slot_" .. slotIndex .. ".json"
end
local function refreshSlotUI()
for i = 1, 5 do
local filePath = getSlotFilePath(i)
local hasData = false
pcall(function()
if isfile and isfile(filePath) then
local content = readfile(filePath)
if content and content ~= "" then
hasData = true
end
end
end)
if slotRows[i] then
if hasData then
slotRows[i].label.Text = "Slot " .. i .. " [Saved]"
slotRows[i].label.TextColor3 = Color3.fromRGB(120, 224, 143)
else
slotRows[i].label.Text = "Slot " .. i .. " [Empty]"
slotRows[i].label.TextColor3 = Color3.fromRGB(180, 185, 200)
end
end
end
end
for i = 1, 5 do
local row = Instance.new("Frame")
row.Size = UDim2.new(1, 0, 0, 34)
row.BackgroundColor3 = Color3.fromRGB(20, 22, 30)
row.LayoutOrder = i
row.Parent = SlotContainer
Instance.new("UICorner", row).CornerRadius = UDim.new(0, 6)
local label = Instance.new("TextLabel")
label.Size = UDim2.new(0, 95, 1, 0)
label.Position = UDim2.new(0, 8, 0, 0)
label.BackgroundTransparency = 1
label.Text = "Slot " .. i .. " [Empty]"
label.TextColor3 = Color3.fromRGB(180, 185, 200)
label.Font = Enum.Font.GothamBold
label.TextSize = 11
label.TextXAlignment = Enum.TextXAlignment.Left
label.Parent = row
local saveBtn = Instance.new("TextButton")
saveBtn.Size = UDim2.new(0, 56, 0, 24)
saveBtn.Position = UDim2.new(1, -126, 0.5, -12)
saveBtn.BackgroundColor3 = Color3.fromRGB(0, 206, 201)
saveBtn.Text = "Save"
saveBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
saveBtn.Font = Enum.Font.GothamBold
saveBtn.TextSize = 11
saveBtn.Parent = row
Instance.new("UICorner", saveBtn).CornerRadius = UDim.new(0, 4)
local loadBtn = Instance.new("TextButton")
loadBtn.Size = UDim2.new(0, 56, 0, 24)
loadBtn.Position = UDim2.new(1, -64, 0.5, -12)
loadBtn.BackgroundColor3 = Color3.fromRGB(46, 204, 113)
loadBtn.Text = "Load"
loadBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
loadBtn.Font = Enum.Font.GothamBold
loadBtn.TextSize = 11
loadBtn.Parent = row
Instance.new("UICorner", loadBtn).CornerRadius = UDim.new(0, 4)
slotRows[i] = {label = label}
-- Save macro to this slot
saveBtn.Activated:Connect(function()
if #pointsData == 0 then
StatusLabel.Text = "Status: No points to save!"
task.delay(2, function() if not isRunning then StatusLabel.Text = "Status: Resting" 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)
writefile(getSlotFilePath(i), jsonString)
JsonInbox.Text = jsonString
end)
refreshSlotUI()
StatusLabel.Text = "Status: Saved to Slot " .. i .. "!"
task.delay(2, function() if not isRunning then StatusLabel.Text = "Status: Resting" end end)
end)
-- Load macro from this slot
loadBtn.Activated:Connect(function()
if isRunning then return end
local filePath = getSlotFilePath(i)
pcall(function()
if isfile and isfile(filePath) then
local rawText = readfile(filePath)
local decodedData = HttpService:JSONDecode(rawText)
if type(decodedData) == "table" and #decodedData > 0 then
for _, data in ipairs(pointsData) do data.frame:Destroy() end
table.clear(pointsData)
setMode("None")
for _, item in ipairs(decodedData) do
if item.x and item.y then
createWaypoint(item.x, item.y, item.delay or 0.1)
end
end
JsonInbox.Text = rawText
StatusLabel.Text = "Status: Loaded from Slot " .. i .. "!"
else
StatusLabel.Text = "Status: Slot " .. i .. " is invalid!"
end
else
StatusLabel.Text = "Status: Slot " .. i .. " is empty!"
end
end)
DataStorePopup.Visible = false
task.delay(2.5, function()
if not isRunning then StatusLabel.Text = "Status: Resting" end
end)
end)
end
-- 3. DRAG SYSTEM FOR MAIN UI
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))
-- MINIMIZE / COMPACT FRAME FEATURE
MinimizeBtn.Activated:Connect(function()
isMinimized = not isMinimized
if isMinimized then
MinimizeBtn.Text = "🗖"
MainFrame.Size = UDim2.new(0, 310, 0, 38)
BtnContainer.Visible = false
StatusLabel.Visible = false
JsonInbox.Visible = false
TimePopup.Visible = false
LoadPopup.Visible = false
DataStorePopup.Visible = false
else
MinimizeBtn.Text = "🗕"
MainFrame.Size = UDim2.new(0, 310, 0, 480)
BtnContainer.Visible = true
StatusLabel.Visible = true
JsonInbox.Visible = true
end
end)
local function isClickingOnMacroUI(clickPos)
local frames = {MainFrame, TimePopup, LoadPopup, DataStorePopup}
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
LoadPopup.Visible = false
DataStorePopup.Visible = false
if currentMode == "None" then StatusLabel.Text = "Status: Resting"
elseif currentMode == "Add" then StatusLabel.Text = "Status: Click screen to place point"
elseif currentMode == "Move" then StatusLabel.Text = "Status: Drag points to move"
elseif currentMode == "Time" then StatusLabel.Text = "Status: Click point to edit time"
elseif currentMode == "DeleteOne" then StatusLabel.Text = "Status: Click point to DELETE" end
end
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. WAYPOINT CREATION
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; LoadPopup.Visible = false; DataStorePopup.Visible = false
elseif currentMode == "DeleteOne" and (input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch) then
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)
end
end)
UserInputService.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
draggingPoint = false
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)
-- SAVE SCRIPT FEATURE
BtnSave.Activated:Connect(function()
if #pointsData == 0 then
StatusLabel.Text = "Status: No points to save!"
task.delay(2, function() if not isRunning then StatusLabel.Text = "Status: Resting" 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)
JsonInbox.Text = jsonString
end)
StatusLabel.Text = "Status: Script saved to Inbox!"
task.delay(3, function() if not isRunning then StatusLabel.Text = "Status: Resting" end end)
end)
-- LOAD SCRIPT FEATURE
BtnLoad.Activated:Connect(function()
if isRunning then return end
TimePopup.Visible = false
DataStorePopup.Visible = false
LoadPopup.Visible = not LoadPopup.Visible
end)
-- DATA STORE BUTTON
BtnDataStore.Activated:Connect(function()
if isRunning then return end
TimePopup.Visible = false
LoadPopup.Visible = false
refreshSlotUI()
DataStorePopup.Visible = not DataStorePopup.Visible
end)
DSCloseBtn.Activated:Connect(function()
DataStorePopup.Visible = false
end)
PopupLoadBtn.Activated:Connect(function()
local rawText = LoadInput.Text
if rawText == "" then
LoadPopup.Visible = false
return
end
pcall(function()
local decodedData = HttpService:JSONDecode(rawText)
if type(decodedData) == "table" and #decodedData > 0 then
for _, data in ipairs(pointsData) do data.frame:Destroy() end
table.clear(pointsData)
setMode("None")
for _, item in ipairs(decodedData) do
if item.x and item.y then
createWaypoint(item.x, item.y, item.delay or 0.1)
end
end
JsonInbox.Text = rawText
StatusLabel.Text = "Status: Script loaded successfully!"
else
StatusLabel.Text = "Status: Invalid JSON format!"
end
end)
LoadPopup.Visible = false
task.delay(2.5, function()
if not isRunning then StatusLabel.Text = "Status: Resting" 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")
JsonInbox.Text = ""
end)
-- 5. RUN MACRO (BACKGROUND RUNNING SUPPORT & COUNTDOWN)
BtnStart.Activated:Connect(function()
if #pointsData == 0 then return end
if isRunning then
isRunning = false
BtnStart.Text = "▶️ START MACRO"
BtnStart.BackgroundColor3 = Color3.fromRGB(0, 184, 148)
setMode("None")
return
end
isRunning = true
currentMode = "Run"
TimePopup.Visible = false
LoadPopup.Visible = false
DataStorePopup.Visible = false
BtnStart.Text = "⏹️ STOP MACRO"
BtnStart.BackgroundColor3 = Color3.fromRGB(214, 48, 49)
task.spawn(function()
while isRunning do
for _, data in ipairs(pointsData) do
if not isRunning then break end
pcall(function()
data.frame.BackgroundColor3 = Color3.fromRGB(255, 71, 87)
end)
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. PHYSICAL CLICK
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)
VirtualInputManager:SendMouseButtonEvent(clickX, clickY + guiInset.Y, 0, false, game, 1)
VirtualInputManager:SendTouchEvent(data.id, 2, clickX, clickY + guiInset.Y)
end)
-- 2. GUI PENETRATION CLICK
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)
pcall(function()
data.frame.BackgroundColor3 = Color3.fromRGB(255, 159, 67)
end)
-- 3. BUTTON STATE & COUNTDOWN DISPLAY
local remainingTime = data.delay
while remainingTime > 0 and isRunning do
if not isMinimized then
pcall(function()
StatusLabel.Text = string.format("Button State: %d (%.1fs)", data.id, math.max(0, remainingTime))
end)
end
local step = math.min(0.1, remainingTime)
task.wait(step)
remainingTime = remainingTime - step
end
end
task.wait(0.01)
end
if not isRunning then
pcall(function()
StatusLabel.Text = "Status: Resting"
end)
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