Skip to content

Instantly share code, notes, and snippets.

@DuyNgao2306
Created July 26, 2026 04:06
Show Gist options
  • Select an option

  • Save DuyNgao2306/34d6babf202b91b3deb2e8b540d45db7 to your computer and use it in GitHub Desktop.

Select an option

Save DuyNgao2306/34d6babf202b91b3deb2e8b540d45db7 to your computer and use it in GitHub Desktop.
do local Players=game:GetService("Players");local UserInputService=game:GetService("UserInputService");local VirtualInputManager=game:GetService("VirtualInputManager");local HttpService=game:GetService("HttpService");local GuiService=game:GetService("GuiService");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;local runThread=nil;local draggingUI,dragStartUI,startPosUI=false,nil,nil;local draggingPoint,dragStartPoint,activeDot=false,nil,nil;local createWaypoint;local setMode;local function safeClear(t) if table.clear then table.clear(t);else for k in pairs(t) do t[k]=nil;end end end local hasFileSupport=writefile and readfile and isfolder and makefolder ;local folderName="VisualMacroSlots";if hasFileSupport then pcall(function() if not isfolder(folderName) then makefolder(folderName);end end);end 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="⚡ HEAVY CLICK AUTO (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: On break";StatusLabel.TextColor3=Color3.fromRGB(180,185,200);StatusLabel.TextSize=13;StatusLabel.Font=Enum.Font.GothamMedium;StatusLabel.TextXAlignment=Enum.TextXAlignment.Left;StatusLabel.Parent=MainFrame;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...";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","➕ 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 BtnDelOne=createButton("BtnDelOne","❌ Xóa Một",Color3.fromRGB(214,48,49),4);local BtnSave=createButton("BtnSave","💾 Lưu Script",Color3.fromRGB(0,206,201),5);local BtnLoad=createButton("BtnLoad","📥 Tải Script",Color3.fromRGB(46,204,113),6);local BtnDataStore=createButton("BtnDataStore","📦 Data Store",Color3.fromRGB(238,82,83),7);local BtnClear=createButton("BtnClear","🗑️ Xóa Tất Cả",Color3.fromRGB(116,125,140),8);local BtnStart=createButton("BtnStart","▶️ CHẠY MACRO",Color3.fromRGB(0,184,148),9);BtnStart.Size=UDim2.new(1,0,0,40);GridLayout.FillDirectionMaxCells=2;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);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;Instance.new("UICorner",LoadPopup).CornerRadius=UDim.new(0,10);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="Dán JSON Script vào đây:";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="XÁC NHẬN TẢI";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);local DataStorePopup=Instance.new("Frame");DataStorePopup.Size=UDim2.new(0,280,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() if not hasFileSupport then return;end 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 .. " [Đã lưu]" ;slotRows[i].label.TextColor3=Color3.fromRGB(120,224,143);else slotRows[i].label.Text="Slot " .. i .. " [Trống]" ;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,85,1,0);label.Position=UDim2.new(0,6,0,0);label.BackgroundTransparency=1;label.Text="Slot " .. i .. " [Trống]" ;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,48,0,24);saveBtn.Position=UDim2.new(1, -156,0.5, -12);saveBtn.BackgroundColor3=Color3.fromRGB(0,206,201);saveBtn.Text="Lưu";saveBtn.TextColor3=Color3.fromRGB(255,255,255);saveBtn.Font=Enum.Font.GothamBold;saveBtn.TextSize=10;saveBtn.Parent=row;Instance.new("UICorner",saveBtn).CornerRadius=UDim.new(0,4);local loadBtn=Instance.new("TextButton");loadBtn.Size=UDim2.new(0,48,0,24);loadBtn.Position=UDim2.new(1, -104,0.5, -12);loadBtn.BackgroundColor3=Color3.fromRGB(46,204,113);loadBtn.Text="Tải";loadBtn.TextColor3=Color3.fromRGB(255,255,255);loadBtn.Font=Enum.Font.GothamBold;loadBtn.TextSize=10;loadBtn.Parent=row;Instance.new("UICorner",loadBtn).CornerRadius=UDim.new(0,4);local delBtn=Instance.new("TextButton");delBtn.Size=UDim2.new(0,48,0,24);delBtn.Position=UDim2.new(1, -52,0.5, -12);delBtn.BackgroundColor3=Color3.fromRGB(214,48,49);delBtn.Text="Xóa";delBtn.TextColor3=Color3.fromRGB(255,255,255);delBtn.Font=Enum.Font.GothamBold;delBtn.TextSize=10;delBtn.Parent=row;Instance.new("UICorner",delBtn).CornerRadius=UDim.new(0,4);slotRows[i]={label=label};saveBtn.Activated:Connect(function() if not hasFileSupport then return;end if ( #pointsData==0) then return;end local viewport=workspace.CurrentCamera.ViewportSize;local exportTable={};for _,data in ipairs(pointsData) do if (data.frame and data.frame.Parent) then 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,{scaleX=posX/viewport.X ,scaleY=posY/viewport.Y ,delay=data.delay});end end pcall(function() local jsonString=HttpService:JSONEncode(exportTable);writefile(getSlotFilePath(i),jsonString);JsonInbox.Text=jsonString;end);refreshSlotUI();end);loadBtn.Activated:Connect(function() if (isRunning or not hasFileSupport) then return;end local filePath=getSlotFilePath(i);pcall(function() if (isfile and isfile(filePath)) then local rawText=readfile(filePath);if ( not rawText or (rawText=="")) then return;end local decodedData=HttpService:JSONDecode(rawText);if ((type(decodedData)=="table") and ( #decodedData>0)) then for _,data in ipairs(pointsData) do if data.frame then data.frame:Destroy();end end safeClear(pointsData);setMode("None");local viewport=workspace.CurrentCamera.ViewportSize;for _,item in ipairs(decodedData) do local px,py;if (item.scaleX and item.scaleY) then px=item.scaleX * viewport.X ;py=item.scaleY * viewport.Y ;elseif (item.x and item.y) then px=item.x;py=item.y;end if (px and py) then createWaypoint(px,py,item.delay or 0.1 );end end JsonInbox.Text=rawText;end end end);DataStorePopup.Visible=false;end);delBtn.Activated:Connect(function() if not hasFileSupport then return;end local filePath=getSlotFilePath(i);pcall(function() if (delfile and isfile and isfile(filePath)) then delfile(filePath);end end);refreshSlotUI();end);end 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 ((input.UserInputType==Enum.UserInputType.MouseMovement) or (input.UserInputType==Enum.UserInputType.Touch)) then if draggingUI 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 );elseif (draggingPoint and activeDot and (currentMode=="Move")) then local delta=input.Position-dragStartPoint ;local newX=math.clamp(activeDot.Position.X.Offset + delta.X ,20,workspace.CurrentCamera.ViewportSize.X-20 );local newY=math.clamp(activeDot.Position.Y.Offset + delta.Y ,20,workspace.CurrentCamera.ViewportSize.Y-20 );activeDot.Position=UDim2.new(0,newX,0,newY);dragStartPoint=input.Position;end 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;draggingPoint=false;activeDot=nil;end end));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 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="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 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 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};table.insert(pointsData,data);table.insert(connections,Dot.InputBegan:Connect(function(input) if (isRunning or not Dot.Parent) then return;end if ((currentMode=="Move") and ((input.UserInputType==Enum.UserInputType.MouseButton1) or (input.UserInputType==Enum.UserInputType.Touch))) then draggingPoint=true;dragStartPoint=input.Position;activeDot=Dot;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 Dot:Destroy();for i,v in ipairs(pointsData) do if (v==data) then table.remove(pointsData,i);break;end end refreshWaypointIndices();end end));end PopupSave.Activated:Connect(function() if (currentlyEditingPoint and currentlyEditingPoint.frame and currentlyEditingPoint.frame.Parent) 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);BtnSave.Activated:Connect(function() if ( #pointsData==0) then return;end local viewport=workspace.CurrentCamera.ViewportSize;local exportTable={};for _,data in ipairs(pointsData) do if (data.frame and data.frame.Parent) then 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,{scaleX=posX/viewport.X ,scaleY=posY/viewport.Y ,delay=data.delay});end end pcall(function() JsonInbox.Text=HttpService:JSONEncode(exportTable);end);end);BtnLoad.Activated:Connect(function() if isRunning then return;end TimePopup.Visible=false;DataStorePopup.Visible=false;LoadPopup.Visible= not LoadPopup.Visible;end);BtnDataStore.Activated:Connect(function() if (isRunning or not hasFileSupport) 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 if data.frame then data.frame:Destroy();end end safeClear(pointsData);setMode("None");local viewport=workspace.CurrentCamera.ViewportSize;for _,item in ipairs(decodedData) do local px,py;if (item.scaleX and item.scaleY) then px=item.scaleX * viewport.X ;py=item.scaleY * viewport.Y ;elseif (item.x and item.y) then px=item.x;py=item.y;end if (px and py) then createWaypoint(px,py,item.delay or 0.1 );end end JsonInbox.Text=rawText;end end);LoadPopup.Visible=false;end);BtnClear.Activated:Connect(function() if isRunning then return;end for _,data in ipairs(pointsData) do if data.frame then data.frame:Destroy();end end safeClear(pointsData);setMode("None");JsonInbox.Text="";end);BtnStart.Activated:Connect(function() if ( #pointsData==0) then return;end if isRunning then isRunning=false;if runThread then task.cancel(runThread);runThread=nil;end BtnStart.Text="▶️ CHẠY 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="⏹️ DỪNG MACRO";BtnStart.BackgroundColor3=Color3.fromRGB(214,48,49);StatusLabel.Text="Trạng thái: Đang chạy tự động...";runThread=task.spawn(function() while isRunning and ScreenGui and ScreenGui.Parent do for _,data in ipairs(pointsData) do if ( not isRunning or not ScreenGui or not ScreenGui.Parent) then break;end if (data.frame and data.frame.Parent) then 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) ;local targetY=clickY + guiInset.Y ;pcall(function() VirtualInputManager:SendMouseButtonEvent(clickX,targetY,0,true,game,1);VirtualInputManager:SendTouchEvent(data.id,0,clickX,targetY);task.wait(0.08);VirtualInputManager:SendMouseButtonEvent(clickX,targetY,0,false,game,1);VirtualInputManager:SendTouchEvent(data.id,2,clickX,targetY);end);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);local remainingTime=data.delay;local lastSec= -1;while (remainingTime>0) and isRunning and ScreenGui and ScreenGui.Parent do local currentSec=math.ceil(remainingTime);if ( not isMinimized and (currentSec~=lastSec)) then lastSec=currentSec;pcall(function() StatusLabel.Text=string.format("Chạy [%d] - %.1fs",data.id,math.max(0,remainingTime));end);end local step=math.min(0.2,remainingTime);task.wait(step);remainingTime=remainingTime-step ;end end end task.wait(0.01);end isRunning=false;runThread=nil;pcall(function() StatusLabel.Text="Trạng thái: Đang nghỉ";BtnStart.Text="▶️ RUN MACRO";BtnStart.BackgroundColor3=Color3.fromRGB(0,184,148);end);end);end);CloseBtn.Activated:Connect(function() isRunning=false;if runThread then task.cancel(runThread);runThread=nil;end for _,conn in ipairs(connections) do if conn.Connected then conn:Disconnect();end end safeClear(connections);for _,data in ipairs(pointsData) do if data.frame then data.frame:Destroy();end end safeClear(pointsData);ScreenGui:Destroy();end); end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment