waypoint script builder OP
Key RequiredUniversal

waypoint script builder OP

Universal Scriptnvddnvdd 8.4K views 94 executesUpdated Nov 1, 2025
5.0/ 5(1 votes)
10100% Positive
Lua Script•543 lines (17916 chars)
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")

local player = Players.LocalPlayer
local mouse = player:GetMouse()

-- Movement recording variables
local recording = false
local waypoints = {}
local currentTween = nil
local dragging = false
local dragStartPos, frameStartPos
local movementSpeed = 10 -- Default speed

-- Create GUI
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "MovementRecorder"
screenGui.Parent = player.PlayerGui

local mainFrame = Instance.new("Frame")
mainFrame.Size = UDim2.new(0, 350, 0, 500)
mainFrame.Position = UDim2.new(0, 10, 0, 10)
mainFrame.BackgroundColor3 = Color3.fromRGB(40, 40, 40)
mainFrame.BorderSizePixel = 0
mainFrame.Parent = screenGui

local UICorner = Instance.new("UICorner")
UICorner.CornerRadius = UDim.new(0, 8)
UICorner.Parent = mainFrame

-- Title bar for dragging
local titleBar = Instance.new("Frame")
titleBar.Size = UDim2.new(1, 0, 0, 30)
titleBar.Position = UDim2.new(0, 0, 0, 0)
titleBar.BackgroundColor3 = Color3.fromRGB(30, 30, 30)
titleBar.BorderSizePixel = 0
titleBar.Parent = mainFrame

local titleBarCorner = Instance.new("UICorner")
titleBarCorner.CornerRadius = UDim.new(0, 8)
titleBarCorner.Parent = titleBar

local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, 0, 1, 0)
title.Position = UDim2.new(0, 0, 0, 0)
title.BackgroundTransparency = 1
title.TextColor3 = Color3.fromRGB(255, 255, 255)
title.Text = "Movement Recorder (Drag Me)"
title.Font = Enum.Font.GothamBold
title.TextSize = 14
title.Parent = titleBar

local closeButton = Instance.new("TextButton")
closeButton.Size = UDim2.new(0, 25, 0, 25)
closeButton.Position = UDim2.new(1, -30, 0, 2)
closeButton.BackgroundColor3 = Color3.fromRGB(255, 60, 60)
closeButton.TextColor3 = Color3.fromRGB(255, 255, 255)
closeButton.Text = "X"
closeButton.Font = Enum.Font.GothamBold
closeButton.TextSize = 12
closeButton.Parent = titleBar

local closeCorner = Instance.new("UICorner")
closeCorner.CornerRadius = UDim.new(0, 4)
closeCorner.Parent = closeButton

-- Content frame
local contentFrame = Instance.new("Frame")
contentFrame.Size = UDim2.new(1, -20, 1, -40)
contentFrame.Position = UDim2.new(0, 10, 0, 35)
contentFrame.BackgroundTransparency = 1
contentFrame.Parent = mainFrame

local recordButton = Instance.new("TextButton")
recordButton.Size = UDim2.new(1, 0, 0, 40)
recordButton.Position = UDim2.new(0, 0, 0, 0)
recordButton.BackgroundColor3 = Color3.fromRGB(76, 175, 80)
recordButton.TextColor3 = Color3.fromRGB(255, 255, 255)
recordButton.Text = "Start Recording"
recordButton.Font = Enum.Font.Gotham
recordButton.TextSize = 12
recordButton.Parent = contentFrame

local UICorner2 = Instance.new("UICorner")
UICorner2.CornerRadius = UDim.new(0, 6)
UICorner2.Parent = recordButton

local saveButton = Instance.new("TextButton")
saveButton.Size = UDim2.new(1, 0, 0, 40)
saveButton.Position = UDim2.new(0, 0, 0, 50)
saveButton.BackgroundColor3 = Color3.fromRGB(33, 150, 243)
saveButton.TextColor3 = Color3.fromRGB(255, 255, 255)
saveButton.Text = "Generate Movement Script"
saveButton.Font = Enum.Font.Gotham
saveButton.TextSize = 12
saveButton.Parent = contentFrame

local UICorner3 = Instance.new("UICorner")
UICorner3.CornerRadius = UDim.new(0, 6)
UICorner3.Parent = saveButton

local clearButton = Instance.new("TextButton")
clearButton.Size = UDim2.new(1, 0, 0, 30)
clearButton.Position = UDim2.new(0, 0, 0, 100)
clearButton.BackgroundColor3 = Color3.fromRGB(244, 67, 54)
clearButton.TextColor3 = Color3.fromRGB(255, 255, 255)
clearButton.Text = "Clear Waypoints"
clearButton.Font = Enum.Font.Gotham
clearButton.TextSize = 12
clearButton.Parent = contentFrame

local UICorner4 = Instance.new("UICorner")
UICorner4.CornerRadius = UDim.new(0, 6)
UICorner4.Parent = clearButton

-- Speed Control Section
local speedLabel = Instance.new("TextLabel")
speedLabel.Size = UDim2.new(1, 0, 0, 20)
speedLabel.Position = UDim2.new(0, 0, 0, 140)
speedLabel.BackgroundTransparency = 1
speedLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
speedLabel.Text = "Movement Speed: " .. movementSpeed
speedLabel.Font = Enum.Font.Gotham
speedLabel.TextSize = 12
speedLabel.Parent = contentFrame

local speedSliderContainer = Instance.new("Frame")
speedSliderContainer.Size = UDim2.new(1, 0, 0, 25)
speedSliderContainer.Position = UDim2.new(0, 0, 0, 165)
speedSliderContainer.BackgroundColor3 = Color3.fromRGB(60, 60, 60)
speedSliderContainer.Parent = contentFrame

local sliderCorner = Instance.new("UICorner")
sliderCorner.CornerRadius = UDim.new(0, 4)
sliderCorner.Parent = speedSliderContainer

local speedSliderFill = Instance.new("Frame")
speedSliderFill.Size = UDim2.new((movementSpeed - 1) / 49, 0, 1, 0) -- 1-50 range
speedSliderFill.Position = UDim2.new(0, 0, 0, 0)
speedSliderFill.BackgroundColor3 = Color3.fromRGB(33, 150, 243)
speedSliderFill.BorderSizePixel = 0
speedSliderFill.Parent = speedSliderContainer

local fillCorner = Instance.new("UICorner")
fillCorner.CornerRadius = UDim.new(0, 4)
fillCorner.Parent = speedSliderFill

local speedSliderButton = Instance.new("TextButton")
speedSliderButton.Size = UDim2.new(1, 0, 1, 0)
speedSliderButton.Position = UDim2.new(0, 0, 0, 0)
speedSliderButton.BackgroundTransparency = 1
speedSliderButton.Text = ""
speedSliderButton.Parent = speedSliderContainer

local speedMinLabel = Instance.new("TextLabel")
speedMinLabel.Size = UDim2.new(0, 30, 0, 15)
speedMinLabel.Position = UDim2.new(0, 0, 0, 195)
speedMinLabel.BackgroundTransparency = 1
speedMinLabel.TextColor3 = Color3.fromRGB(200, 200, 200)
speedMinLabel.Text = "Slow"
speedMinLabel.Font = Enum.Font.Gotham
speedMinLabel.TextSize = 10
speedMinLabel.Parent = contentFrame

local speedMaxLabel = Instance.new("TextLabel")
speedMaxLabel.Size = UDim2.new(0, 30, 0, 15)
speedMaxLabel.Position = UDim2.new(1, -30, 0, 195)
speedMaxLabel.BackgroundTransparency = 1
speedMaxLabel.TextColor3 = Color3.fromRGB(200, 200, 200)
speedMaxLabel.Text = "Fast"
speedMaxLabel.Font = Enum.Font.Gotham
speedMaxLabel.TextSize = 10
speedMaxLabel.Parent = contentFrame

local statusLabel = Instance.new("TextLabel")
statusLabel.Size = UDim2.new(1, 0, 0, 30)
statusLabel.Position = UDim2.new(0, 0, 0, 215)
statusLabel.BackgroundTransparency = 1
statusLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
statusLabel.Text = "Click anywhere to record waypoints"
statusLabel.Font = Enum.Font.Gotham
statusLabel.TextSize = 12
statusLabel.Parent = contentFrame

local waypointCount = Instance.new("TextLabel")
waypointCount.Size = UDim2.new(1, 0, 0, 20)
waypointCount.Position = UDim2.new(0, 0, 0, 245)
waypointCount.BackgroundTransparency = 1
waypointCount.TextColor3 = Color3.fromRGB(200, 200, 200)
waypointCount.Text = "Waypoints: 0"
waypointCount.Font = Enum.Font.Gotham
waypointCount.TextSize = 11
waypointCount.Parent = contentFrame

-- Script output section
local outputLabel = Instance.new("TextLabel")
outputLabel.Size = UDim2.new(1, 0, 0, 20)
outputLabel.Position = UDim2.new(0, 0, 0, 270)
outputLabel.BackgroundTransparency = 1
outputLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
outputLabel.Text = "Generated Script:"
outputLabel.Font = Enum.Font.GothamBold
outputLabel.TextSize = 12
outputLabel.Parent = contentFrame

local scriptTextBox = Instance.new("TextBox")
scriptTextBox.Size = UDim2.new(1, 0, 0, 180)
scriptTextBox.Position = UDim2.new(0, 0, 0, 295)
scriptTextBox.BackgroundColor3 = Color3.fromRGB(25, 25, 25)
scriptTextBox.TextColor3 = Color3.fromRGB(255, 255, 255)
scriptTextBox.Text = "-- Generated script will appear here"
scriptTextBox.Font = Enum.Font.Code
scriptTextBox.TextSize = 10
scriptTextBox.TextXAlignment = Enum.TextXAlignment.Left
scriptTextBox.TextYAlignment = Enum.TextYAlignment.Top
scriptTextBox.TextWrapped = true
scriptTextBox.ClearTextOnFocus = false
scriptTextBox.MultiLine = true
scriptTextBox.Parent = contentFrame

local textBoxCorner = Instance.new("UICorner")
textBoxCorner.CornerRadius = UDim.new(0, 6)
textBoxCorner.Parent = scriptTextBox

local copyButton = Instance.new("TextButton")
copyButton.Size = UDim2.new(1, 0, 0, 25)
copyButton.Position = UDim2.new(0, 0, 0, 485)
copyButton.BackgroundColor3 = Color3.fromRGB(156, 39, 176)
copyButton.TextColor3 = Color3.fromRGB(255, 255, 255)
copyButton.Text = "Copy to Clipboard"
copyButton.Font = Enum.Font.Gotham
copyButton.TextSize = 12
copyButton.Parent = contentFrame

local UICorner5 = Instance.new("UICorner")
UICorner5.CornerRadius = UDim.new(0, 6)
UICorner5.Parent = copyButton

-- Dragging functionality
local function updateDrag(input)
    if not dragging then return end
    
    local delta = input.Position - dragStartPos
    mainFrame.Position = UDim2.new(
        frameStartPos.X.Scale, 
        frameStartPos.X.Offset + delta.X,
        frameStartPos.Y.Scale, 
        frameStartPos.Y.Offset + delta.Y
    )
end

titleBar.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 then
        dragging = true
        dragStartPos = input.Position
        frameStartPos = mainFrame.Position
        
        input.Changed:Connect(function()
            if input.UserInputState == Enum.UserInputState.End then
                dragging = false
            end
        end)
    end
end)

titleBar.InputChanged:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseMovement then
        updateDrag(input)
    end
end)

UserInputService.InputChanged:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseMovement then
        updateDrag(input)
    end
end)

-- Speed slider functionality
local function updateSpeedSlider(input)
    if input.UserInputType ~= Enum.UserInputType.MouseMovement then return end
    
    local sliderAbsolutePosition = speedSliderContainer.AbsolutePosition
    local sliderAbsoluteSize = speedSliderContainer.AbsoluteSize
    
    local relativeX = (input.Position.X - sliderAbsolutePosition.X) / sliderAbsoluteSize.X
    relativeX = math.clamp(relativeX, 0, 1)
    
    -- Convert to speed range (1-50)
    movementSpeed = math.floor(1 + relativeX * 49)
    
    -- Update slider fill
    speedSliderFill.Size = UDim2.new(relativeX, 0, 1, 0)
    
    -- Update speed label
    speedLabel.Text = "Movement Speed: " .. movementSpeed
end

speedSliderButton.MouseButton1Down:Connect(function()
    updateSpeedSlider({Position = UserInputService:GetMouseLocation(), UserInputType = Enum.UserInputType.MouseMovement})
    
    local connection
    connection = UserInputService.InputChanged:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseMovement then
            updateSpeedSlider(input)
        end
    end)
    
    UserInputService.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 then
            connection:Disconnect()
        end
    end)
end)

-- Function to move character to a point
local function moveToPoint(targetPosition)
    local character = player.Character
    if not character then return end
    
    local humanoid = character:FindFirstChildOfClass("Humanoid")
    local rootPart = character:FindFirstChild("HumanoidRootPart")
    
    if not humanoid or not rootPart then return end
    
    -- Stop any existing movement
    if currentTween then
        currentTween:Cancel()
    end
    
    -- Calculate duration based on distance and speed
    local distance = (rootPart.Position - targetPosition).Magnitude
    local duration = distance / movementSpeed
    
    -- Create a tween for smooth movement
    local tweenInfo = TweenInfo.new(
        duration,
        Enum.EasingStyle.Linear
    )
    
    currentTween = TweenService:Create(rootPart, tweenInfo, {CFrame = CFrame.new(targetPosition)})
    currentTween:Play()
    
    currentTween.Completed:Connect(function()
        currentTween = nil
    end)
end

-- Function to handle mouse clicks for waypoints
local function onMouseClick()
    if not recording then return end
    
    local target = mouse.Target
    if target then
        local hitPoint = mouse.Hit.Position
        table.insert(waypoints, hitPoint)
        waypointCount.Text = "Waypoints: " .. #waypoints
        statusLabel.Text = "Added waypoint " .. #waypoints
        
        -- Move character to the clicked point
        moveToPoint(hitPoint)
        
        -- Visual feedback
        local part = Instance.new("Part")
        part.Size = Vector3.new(1, 1, 1)
        part.Position = hitPoint
        part.Anchored = true
        part.CanCollide = false
        part.Material = Enum.Material.Neon
        part.BrickColor = BrickColor.new("Bright green")
        part.Parent = workspace
        
        -- Remove the indicator after 3 seconds
        game:GetService("Debris"):AddItem(part, 3)
    end
end

-- Function to generate the movement script
local function generateMovementScript()
    if #waypoints == 0 then
        statusLabel.Text = "No waypoints recorded!"
        scriptTextBox.Text = "-- No waypoints recorded!\n-- Click 'Start Recording' and click in the world to add waypoints."
        return
    end
    
    local scriptString = [[-- Auto-generated Movement Script
-- Generated with Movement Recorder
-- Number of waypoints: ]] .. #waypoints .. [[
-- Movement Speed: ]] .. movementSpeed .. [[

local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local player = Players.LocalPlayer

local movementSpeed = ]] .. movementSpeed .. [[  -- Adjust this value to change speed (1-50)

local waypoints = {
]]

    -- Add all waypoints to the script
    for i, point in ipairs(waypoints) do
        scriptString = scriptString .. string.format("    Vector3.new(%.2f, %.2f, %.2f),  -- Waypoint %d\n", point.X, point.Y, point.Z, i)
    end

    scriptString = scriptString .. [[}

local function executeMovement()
    local character = player.Character
    if not character then
        character = player.CharacterAdded:Wait()
    end
    
    local humanoid = character:FindFirstChildOfClass("Humanoid")
    local rootPart = character:FindFirstChild("HumanoidRootPart")
    
    if not humanoid or not rootPart then 
        warn("Movement Script: No humanoid or root part found!")
        return 
    end
    
    for i, waypoint in ipairs(waypoints) do
        print("Moving to waypoint " .. i .. "...")
        
        -- Move to waypoint
        local distance = (rootPart.Position - waypoint).Magnitude
        local duration = distance / movementSpeed
        local tweenInfo = TweenInfo.new(
            duration,
            Enum.EasingStyle.Linear
        )
        local tween = TweenService:Create(rootPart, tweenInfo, {CFrame = CFrame.new(waypoint)})
        tween:Play()
        tween.Completed:Wait()
        
        wait(0.1)  -- Small delay between waypoints
    end
    
    print("Movement completed!")
end

-- Execute the movement (remove if you want to call it manually)
executeMovement()
]]

    scriptTextBox.Text = scriptString
    statusLabel.Text = "Script generated! Click 'Copy to Clipboard'"
end

-- Function to copy text to clipboard
local function copyToClipboard()
    if scriptTextBox.Text and scriptTextBox.Text ~= "" then
        scriptTextBox:CaptureFocus()
        scriptTextBox.Text = scriptTextBox.Text  -- This helps with selection
        wait()
        scriptTextBox:ReleaseFocus()
        
        -- For Roblox's built-in copy functionality (works in some executors)
        pcall(function()
            game:GetService("TextService"):SetSelection(scriptTextBox)
        end)
        
        statusLabel.Text = "Text selected - Use Ctrl+C to copy"
    end
end

-- Function to clear waypoints
local function clearWaypoints()
    waypoints = {}
    waypointCount.Text = "Waypoints: 0"
    statusLabel.Text = "Waypoints cleared!"
    scriptTextBox.Text = "-- Waypoints cleared\n-- Click 'Start Recording' to begin"
    
    if recording then
        recording = false
        recordButton.BackgroundColor3 = Color3.fromRGB(76, 175, 80)
        recordButton.Text = "Start Recording"
    end
end

-- Toggle recording state
recordButton.MouseButton1Click:Connect(function()
    recording = not recording
    
    if recording then
        recordButton.BackgroundColor3 = Color3.fromRGB(244, 67, 54)
        recordButton.Text = "Stop Recording"
        statusLabel.Text = "Recording... Click to add waypoints"
        waypointCount.Text = "Waypoints: " .. #waypoints
    else
        recordButton.BackgroundColor3 = Color3.fromRGB(76, 175, 80)
        recordButton.Text = "Start Recording"
        statusLabel.Text = "Recording stopped. " .. #waypoints .. " waypoints recorded"
    end
end)

-- Generate movement script
saveButton.MouseButton1Click:Connect(function()
    if recording then
        statusLabel.Text = "Stop recording before generating script!"
        return
    end
    
    generateMovementScript()
end)

-- Clear waypoints
clearButton.MouseButton1Click:Connect(function()
    clearWaypoints()
end)

-- Copy to clipboard
copyButton.MouseButton1Click:Connect(function()
    copyToClipboard()
end)

-- Close button
closeButton.MouseButton1Click:Connect(function()
    screenGui:Destroy()
end)

-- Connect mouse click event
mouse.Button1Down:Connect(onMouseClick)

-- Clean up when player leaves
player.CharacterRemoving:Connect(function()
    if currentTween then
        currentTween:Cancel()
    end
end)

-- Instructions
scriptTextBox.Text = [[-- Movement Recorder Instructions --

1. Click 'Start Recording'
2. Click anywhere in the 3D world to set waypoints
3. Your character will automatically move to each point
4. Adjust speed using the slider (1 = slow, 50 = fast)
5. Click 'Stop Recording' when done
6. Click 'Generate Movement Script' to create the script
7. Click 'Copy to Clipboard' and paste into your executor

Tip: Use clear areas for better movement!]]

Features & Information

An utility script gui that lets you set waypoints to tween to, start recording and end recording so you can generate a script to replay your waypoints Useful for autofarming or/movement macro for autogrinding To use this script, click on areas to record your waypoints, your character will tween to those waypoints, when your done recording your movement click "Stop Recording", you can generate the script after you stop recording and build functions for each waypoint to indeed create your own script.
#macro#generator#script#builder#op

Community Comments (2)

nvddnvddNov 1, 2025

select all in script paste into your executor to execute if it doesent work make it a loadstring

AepxyzoAepxyzoDec 2, 2025

Can you make the script movable for mobile?

More Scripts for Universal Scripts