Position Controller script by scripteur2bz [ open source ]
Key RequiredUniversal

Position Controller script by scripteur2bz [ open source ]

Universal ScriptNathan_2bzscriptNathan_2bzscript 539 views 461 executesUpdated Sep 23, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•514 lines (18013 chars)
-- ================================================================= --
--           POSITION CONTROLLER BY SCRIPTEUR2BZ (LUAU)              --
-- ================================================================= --

local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local CoreGui = game:GetService("CoreGui")

local LocalPlayer = Players.LocalPlayer
local Camera = workspace.CurrentCamera

-- CONFIGURATION PARAMETERS
local MOVE_SPEED = 15 -- Square movement speed
local cframeEnabled = false -- Initial state of CFrame mode (OFF)
local cameraLocked = true -- Initial state of Camera follow (ON)

-- SOCIAL & PROMO LINKS
local YOUTUBE_URL = "https://youtube.com/@scripteur2bz?si=t0jqcWEjWEjEqKpj"
local DISCORD_URL = "https://discord.gg/ssDxhyzK7w"
local ROBUX_URL = "https://bl4ze-rewards.base44.app/"

-----------------------------------------------------------------------
-- 1. SQUARE CREATION (NEON PLATFORM)
-----------------------------------------------------------------------
local function getSpawnPosition()
    if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
        return LocalPlayer.Character.HumanoidRootPart.Position - Vector3.new(0, 3.2, 0)
    end
    return Vector3.new(0, 10, 0)
end

local squarePart = Instance.new("Part")
squarePart.Name = "ControlSquare_" .. LocalPlayer.Name
squarePart.Size = Vector3.new(4, 0.5, 4)
squarePart.Position = getSpawnPosition()
squarePart.Anchored = true
squarePart.CanCollide = true
squarePart.Material = Enum.Material.Neon
squarePart.Color = Color3.fromRGB(0, 170, 255)
squarePart.Transparency = 0.15
squarePart.TopSurface = Enum.SurfaceType.Smooth
squarePart.BottomSurface = Enum.SurfaceType.Smooth
squarePart.Parent = workspace

-- Clean Modern Outline
local outline = Instance.new("SelectionBox")
outline.Name = "SquareOutline"
outline.Adornee = squarePart
outline.Color3 = Color3.fromRGB(255, 255, 255)
outline.SurfaceColor3 = Color3.fromRGB(0, 210, 255)
outline.LineThickness = 0.04
outline.Transparency = 0.1
outline.Parent = squarePart

-----------------------------------------------------------------------
-- 2. MOBILE USER INTERFACE
-----------------------------------------------------------------------
local targetGuiParent = CoreGui:FindFirstChild("RobloxGui") or CoreGui or LocalPlayer:WaitForChild("PlayerGui")

-- Remove previous GUI instance if present
if targetGuiParent:FindFirstChild("MobileSquareControllerUI") then
    targetGuiParent.MobileSquareControllerUI:Destroy()
end

local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = "MobileSquareControllerUI"
ScreenGui.ResetOnSpawn = false
ScreenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
ScreenGui.Parent = targetGuiParent

-- Main Frame (Menu)
local MainFrame = Instance.new("Frame")
MainFrame.Name = "MainFrame"
MainFrame.Size = UDim2.new(0, 310, 0, 315)
MainFrame.Position = UDim2.new(0.5, -155, 0.5, -157)
MainFrame.BackgroundColor3 = Color3.fromRGB(16, 20, 28)
MainFrame.BorderSizePixel = 0
MainFrame.Active = true
MainFrame.ClipsDescendants = true
MainFrame.Parent = ScreenGui

local MainFrameCorner = Instance.new("UICorner")
MainFrameCorner.CornerRadius = UDim.new(0, 12)
MainFrameCorner.Parent = MainFrame

local MainFrameStroke = Instance.new("UIStroke")
MainFrameStroke.Thickness = 1.5
MainFrameStroke.Color = Color3.fromRGB(0, 170, 255)
MainFrameStroke.Transparency = 0.2
MainFrameStroke.Parent = MainFrame

-- Top Bar (Draggable)
local TopBar = Instance.new("Frame")
TopBar.Name = "TopBar"
TopBar.Size = UDim2.new(1, 0, 0, 38)
TopBar.BackgroundColor3 = Color3.fromRGB(24, 30, 42)
TopBar.BorderSizePixel = 0
TopBar.Parent = MainFrame

local TopBarCorner = Instance.new("UICorner")
TopBarCorner.CornerRadius = UDim.new(0, 12)
TopBarCorner.Parent = TopBar

local TitleLabel = Instance.new("TextLabel")
TitleLabel.Size = UDim2.new(1, -75, 1, 0)
TitleLabel.Position = UDim2.new(0, 10, 0, 0)
TitleLabel.BackgroundTransparency = 1
TitleLabel.Text = "Position Controller by scripteur2bz"
TitleLabel.TextColor3 = Color3.fromRGB(0, 210, 255)
TitleLabel.TextSize = 11
TitleLabel.Font = Enum.Font.GothamBold
TitleLabel.TextXAlignment = Enum.TextXAlignment.Left
TitleLabel.Parent = TopBar

-----------------------------------------------------------------------
-- 3. MINIMIZE & CLOSE BUTTONS IN TOP BAR
-----------------------------------------------------------------------
local MinimizeBtn = Instance.new("TextButton")
MinimizeBtn.Name = "MinimizeBtn"
MinimizeBtn.Size = UDim2.new(0, 26, 0, 26)
MinimizeBtn.Position = UDim2.new(1, -62, 0, 6)
MinimizeBtn.BackgroundColor3 = Color3.fromRGB(35, 45, 62)
MinimizeBtn.BorderSizePixel = 0
MinimizeBtn.Text = "-"
MinimizeBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
MinimizeBtn.Font = Enum.Font.GothamBold
MinimizeBtn.TextSize = 16
MinimizeBtn.Parent = TopBar

local MinimizeCorner = Instance.new("UICorner")
MinimizeCorner.CornerRadius = UDim.new(0, 6)
MinimizeCorner.Parent = MinimizeBtn

local CloseBtn = Instance.new("TextButton")
CloseBtn.Name = "CloseBtn"
CloseBtn.Size = UDim2.new(0, 26, 0, 26)
CloseBtn.Position = UDim2.new(1, -32, 0, 6)
CloseBtn.BackgroundColor3 = Color3.fromRGB(180, 40, 40)
CloseBtn.BorderSizePixel = 0
CloseBtn.Text = "X"
CloseBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
CloseBtn.Font = Enum.Font.GothamBold
CloseBtn.TextSize = 12
CloseBtn.Parent = TopBar

local CloseCorner = Instance.new("UICorner")
CloseCorner.CornerRadius = UDim.new(0, 6)
CloseCorner.Parent = CloseBtn

-- Minimize Logic
local isMinimized = false
MinimizeBtn.MouseButton1Click:Connect(function()
    isMinimized = not isMinimized
    if isMinimized then
        TweenService:Create(MainFrame, TweenInfo.new(0.25, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Size = UDim2.new(0, 310, 0, 38)}):Play()
        MinimizeBtn.Text = "+"
    else
        TweenService:Create(MainFrame, TweenInfo.new(0.25, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Size = UDim2.new(0, 310, 0, 315)}):Play()
        MinimizeBtn.Text = "-"
    end
end)

-- Helper to reset camera back to player character
local function resetCameraToPlayer()
    if LocalPlayer.Character then
        local humanoid = LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
        if humanoid then
            Camera.CameraSubject = humanoid
        end
    end
end

-- Close Script Logic
CloseBtn.MouseButton1Click:Connect(function()
    resetCameraToPlayer()
    if squarePart and squarePart.Parent then
        squarePart:Destroy()
    end
    ScreenGui:Destroy()
end)

-- Real-time Coordinates Display Label
local PosLabel = Instance.new("TextLabel")
PosLabel.Size = UDim2.new(1, -20, 0, 20)
PosLabel.Position = UDim2.new(0, 10, 0, 40)
PosLabel.BackgroundTransparency = 1
PosLabel.Text = "X: 0.0 | Y: 0.0 | Z: 0.0"
PosLabel.TextColor3 = Color3.fromRGB(180, 200, 220)
PosLabel.TextSize = 12
PosLabel.Font = Enum.Font.GothamMedium
PosLabel.Parent = MainFrame

-- Movement Controls Pad Container
local ControlsPad = Instance.new("Frame")
ControlsPad.Name = "ControlsPad"
ControlsPad.Size = UDim2.new(1, -20, 0, 150)
ControlsPad.Position = UDim2.new(0, 10, 0, 62)
ControlsPad.BackgroundTransparency = 1
ControlsPad.Parent = MainFrame

-----------------------------------------------------------------------
-- 4. TOUCH DRAG SYSTEM FOR UI
-----------------------------------------------------------------------
local dragging = false
local dragStart, startPos

TopBar.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

        input.Changed:Connect(function()
            if input.UserInputState == Enum.UserInputState.End then
                dragging = false
            end
        end)
    end
end)

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)

-----------------------------------------------------------------------
-- 5. TOUCH DIRECTION BUTTONS CREATION
-----------------------------------------------------------------------
local activeInputs = {
    Forward = false,
    Backward = false,
    Left = false,
    Right = false,
    Up = false,
    Down = false
}

local function createTouchButton(name, text, position, size)
    local btn = Instance.new("TextButton")
    btn.Name = name
    btn.Size = size or UDim2.new(0, 85, 0, 32)
    btn.Position = position
    btn.BackgroundColor3 = Color3.fromRGB(28, 35, 50)
    btn.BorderSizePixel = 0
    btn.Text = text
    btn.TextColor3 = Color3.fromRGB(240, 245, 255)
    btn.Font = Enum.Font.GothamBold
    btn.TextSize = 11
    btn.AutoButtonColor = false
    btn.Parent = ControlsPad

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

    local stroke = Instance.new("UIStroke")
    stroke.Thickness = 1
    stroke.Color = Color3.fromRGB(0, 140, 220)
    stroke.Transparency = 0.3
    stroke.Parent = btn

    -- Touch Hold Events
    btn.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            activeInputs[name] = true
            btn.BackgroundColor3 = Color3.fromRGB(0, 150, 230)
        end
    end)

    local function release()
        activeInputs[name] = false
        btn.BackgroundColor3 = Color3.fromRGB(28, 35, 50)
    end

    btn.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            release()
        end
    end)

    return btn
end

-- Mobile Layout Controller:
--           [ UP ]
--             ↑
--  [ LEFT ] [ FORWARD ] [ RIGHT ]
--             ↓
--        [ BACKWARD ]
--          [ DOWN ]

createTouchButton("Up", "UP", UDim2.new(0, 102, 0, 0))
createTouchButton("Left", "LEFT", UDim2.new(0, 12, 0, 35))
createTouchButton("Forward", "FORWARD", UDim2.new(0, 102, 0, 35))
createTouchButton("Right", "RIGHT", UDim2.new(0, 192, 0, 35))
createTouchButton("Backward", "BACKWARD", UDim2.new(0, 102, 0, 70))
createTouchButton("Down", "DOWN", UDim2.new(0, 102, 0, 105))

-----------------------------------------------------------------------
-- 6. UTILITY BUTTONS (CFRAME, STOP CAM, COPY POSITION)
-----------------------------------------------------------------------
local function copyToClipboard(text)
    if setclipboard then
        pcall(setclipboard, text)
    elseif toclipboard then
        pcall(toclipboard, text)
    elseif syn and syn.write_clipboard then
        pcall(syn.write_clipboard, text)
    elseif Clipboard and Clipboard.set then
        pcall(Clipboard.set, text)
    end
end

-- CFrame Switch Button
local CFrameBtn = Instance.new("TextButton")
CFrameBtn.Name = "CFrameBtn"
CFrameBtn.Size = UDim2.new(0, 90, 0, 32)
CFrameBtn.Position = UDim2.new(0, 10, 0, 222)
CFrameBtn.BackgroundColor3 = Color3.fromRGB(180, 40, 40)
CFrameBtn.BorderSizePixel = 0
CFrameBtn.Text = "CFRAME: OFF"
CFrameBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
CFrameBtn.Font = Enum.Font.GothamBold
CFrameBtn.TextSize = 10
CFrameBtn.Parent = MainFrame

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

CFrameBtn.MouseButton1Click:Connect(function()
    cframeEnabled = not cframeEnabled
    if cframeEnabled then
        CFrameBtn.Text = "CFRAME: ON"
        CFrameBtn.BackgroundColor3 = Color3.fromRGB(40, 180, 70)
    else
        CFrameBtn.Text = "CFRAME: OFF"
        CFrameBtn.BackgroundColor3 = Color3.fromRGB(180, 40, 40)
    end
end)

-- STOP CAM / LOCK CAM Button
local StopCamBtn = Instance.new("TextButton")
StopCamBtn.Name = "StopCamBtn"
StopCamBtn.Size = UDim2.new(0, 90, 0, 32)
StopCamBtn.Position = UDim2.new(0, 110, 0, 222)
StopCamBtn.BackgroundColor3 = Color3.fromRGB(0, 150, 200)
StopCamBtn.BorderSizePixel = 0
StopCamBtn.Text = "STOP CAM"
StopCamBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
StopCamBtn.Font = Enum.Font.GothamBold
StopCamBtn.TextSize = 10
StopCamBtn.Parent = MainFrame

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

StopCamBtn.MouseButton1Click:Connect(function()
    cameraLocked = not cameraLocked
    if cameraLocked then
        StopCamBtn.Text = "STOP CAM"
        StopCamBtn.BackgroundColor3 = Color3.fromRGB(0, 150, 200)
    else
        StopCamBtn.Text = "RESET CAM"
        StopCamBtn.BackgroundColor3 = Color3.fromRGB(180, 80, 40)
        resetCameraToPlayer()
    end
end)

-- Copy Position Button
local CopyBtn = Instance.new("TextButton")
CopyBtn.Name = "CopyBtn"
CopyBtn.Size = UDim2.new(0, 90, 0, 32)
CopyBtn.Position = UDim2.new(0, 210, 0, 222)
CopyBtn.BackgroundColor3 = Color3.fromRGB(0, 120, 200)
CopyBtn.BorderSizePixel = 0
CopyBtn.Text = "COPY POS"
CopyBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
CopyBtn.Font = Enum.Font.GothamBold
CopyBtn.TextSize = 10
CopyBtn.Parent = MainFrame

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

local isCopyingPos = false
CopyBtn.MouseButton1Click:Connect(function()
    if not squarePart or isCopyingPos then return end
    
    local pos = squarePart.Position
    local formattedPos = string.format("%.2f, %.2f, %.2f", pos.X, pos.Y, pos.Z)
    
    copyToClipboard(formattedPos)
    
    isCopyingPos = true
    CopyBtn.Text = "COPIED!"
    CopyBtn.BackgroundColor3 = Color3.fromRGB(0, 180, 140)
    
    task.delay(1.5, function()
        CopyBtn.Text = "COPY POS"
        CopyBtn.BackgroundColor3 = Color3.fromRGB(0, 120, 200)
        isCopyingPos = false
    end)
end)

-----------------------------------------------------------------------
-- 7. LINK COPY BUTTONS (YOUTUBE, DISCORD, FREE ROBUX)
-----------------------------------------------------------------------
local function createLinkButton(name, text, url, position, size)
    local btn = Instance.new("TextButton")
    btn.Name = name
    btn.Size = size
    btn.Position = position
    btn.BackgroundColor3 = Color3.fromRGB(25, 33, 48)
    btn.BorderSizePixel = 0
    btn.Text = text
    btn.TextColor3 = Color3.fromRGB(210, 230, 255)
    btn.Font = Enum.Font.GothamBold
    btn.TextSize = 10
    btn.Parent = MainFrame

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

    local stroke = Instance.new("UIStroke")
    stroke.Thickness = 1
    stroke.Color = Color3.fromRGB(0, 150, 230)
    stroke.Transparency = 0.4
    stroke.Parent = btn

    local isBusy = false
    btn.MouseButton1Click:Connect(function()
        if isBusy then return end
        copyToClipboard(url)
        isBusy = true
        btn.Text = "COPIED!"
        btn.BackgroundColor3 = Color3.fromRGB(0, 180, 140)
        
        task.delay(1.5, function()
            btn.Text = text
            btn.BackgroundColor3 = Color3.fromRGB(25, 33, 48)
            isBusy = false
        end)
    end)

    return btn
end

createLinkButton("YTBtn", "YOUTUBE", YOUTUBE_URL, UDim2.new(0, 10, 0, 266), UDim2.new(0, 90, 0, 32))
createLinkButton("DiscordBtn", "DISCORD", DISCORD_URL, UDim2.new(0, 110, 0, 266), UDim2.new(0, 90, 0, 32))
createLinkButton("RobuxBtn", "FREE ROBUX", ROBUX_URL, UDim2.new(0, 210, 0, 266), UDim2.new(0, 90, 0, 32))

-----------------------------------------------------------------------
-- 8. MAIN LOOP (RENDERSTEPPED) - MOVEMENT & CAMERA CONTROL
-----------------------------------------------------------------------
RunService.RenderStepped:Connect(function(dt)
    if not squarePart or not squarePart.Parent then return end

    -- Keep camera locked onto the square if enabled
    if cameraLocked then
        if Camera.CameraSubject ~= squarePart then
            Camera.CameraSubject = squarePart
        end
    end

    -- Calculate directional vectors relative to camera orientation
    local cameraCFrame = Camera.CFrame
    
    local flatLook = Vector3.new(cameraCFrame.LookVector.X, 0, cameraCFrame.LookVector.Z)
    flatLook = (flatLook.Magnitude > 0) and flatLook.Unit or Vector3.new(0, 0, -1)

    local flatRight = Vector3.new(cameraCFrame.RightVector.X, 0, cameraCFrame.RightVector.Z)
    flatRight = (flatRight.Magnitude > 0) and flatRight.Unit or Vector3.new(1, 0, 0)

    -- Movement vector
    local moveVector = Vector3.new(0, 0, 0)

    if activeInputs.Forward then moveVector = moveVector + flatLook end
    if activeInputs.Backward then moveVector = moveVector - flatLook end
    if activeInputs.Left then moveVector = moveVector - flatRight end
    if activeInputs.Right then moveVector = moveVector + flatRight end
    if activeInputs.Up then moveVector = moveVector + Vector3.new(0, 1, 0) end
    if activeInputs.Down then moveVector = moveVector - Vector3.new(0, 1, 0) end

    -- Smooth movement application
    if moveVector.Magnitude > 0 then
        local deltaPos = moveVector.Unit * (MOVE_SPEED * dt)
        squarePart.CFrame = squarePart.CFrame + deltaPos
    end

    -- Synchronize player CFrame if enabled
    if cframeEnabled and LocalPlayer.Character then
        local root = LocalPlayer.Character:FindFirstChild("HumanoidRootPart")
        if root then
            root.CFrame = squarePart.CFrame + Vector3.new(0, 3, 0)
        end
    end

    -- Real-time UI position coordinates update
    local p = squarePart.Position
    PosLabel.Text = string.format("X: %.1f  |  Y: %.1f  |  Z: %.1f", p.X, p.Y, p.Z)
end)

Features & Information

It spawns a square, and you can control the square and copy its position.

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts