Script de suspensao simples
Key Required

Script de suspensao simples

Car Dealership Tycoon [🚗]Maxx54Maxx54 8.4K views 15.8K executesUpdated Jan 15, 2026
1.7/ 5(6 votes)
2433% Positive
Lua Script•371 lines (12180 chars)
-- Script Lua para Roblox - Menu de Tuning de Cambagem e Posição (Camber/Offset/Height)
-- Correções:
-- • Drag totalmente refeito do zero: agora só arrasta se você começar segurando EM CIMA do botão/menu
-- • Continua arrastando mesmo se o dedo/souris sair do botão (funciona perfeitamente em PC e mobile)
-- • Removido o código antigo que movia o botão com toque em qualquer lugar da tela
-- • Layout das linhas de ajuste corrigido (alinhamento perfeito, botões simétricos)
-- • Pequenos ajustes visuais e de texto
-- • Executar com Xeno Executor

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

local workspace = game.Workspace
local carsFolder = workspace:FindFirstChild("Cars") or workspace:WaitForChild("Cars", 10)
if not carsFolder then warn("Pasta Cars não encontrada") return end

local myCar = nil
local groups = {
    front = {right = {}, left = {}},
    back  = {right = {}, left = {}}
}
local current_mode = "front"

-- Função para coletar Steers
local function collectSteers(carModel)
    local function get(name)
        local list = {}
        for _, obj in ipairs(carModel:GetDescendants()) do
            if obj.Name == name and obj:FindFirstChild("Axel") then
                local steer = obj.Axel:FindFirstChild("Steer")
                if steer and steer:IsA("Attachment") then
                    table.insert(list, steer)
                end
            end
        end
        return list
    end
    
    return {
        front = {right = get("FR"), left = get("FL")},
        back  = {right = get("RR"), left = get("RL")}
    }
end

-- Função para encontrar o carro atual do player
local function updateCurrentCar()
    local foundCar = nil
    for _, model in ipairs(carsFolder:GetChildren()) do
        if model:IsA("Model") then
            local stats = model:FindFirstChild("Stats")
            if stats then
                local owner = stats:FindFirstChild("Owner")
                if owner then
                    if (owner:IsA("ObjectValue") and owner.Value == player) or 
                       (owner:IsA("StringValue") and owner.Value == player.Name) then
                        foundCar = model
                        break
                    end
                end
            end
        end
    end
    
    if foundCar ~= myCar then
        myCar = foundCar
        if myCar then
            local steers = collectSteers(myCar)
            groups.front = steers.front
            groups.back  = steers.back
        else
            groups.front = {right = {}, left = {}}
            groups.back  = {right = {}, left = {}}
        end
        updateValues()
    end
end

-- Draggable novo (feito do zero - funciona perfeitamente em PC e mobile)
local function makeDraggable(frame)
    local dragging = true
    local dragInput = nil
    local dragStart = true
    local startPos = nil

    local function update(input)
        local delta = input.Position - dragStart
        frame.Position = UDim2.new(
            startPos.X.Scale,
            startPos.X.Offset + delta.X,
            startPos.Y.Scale,
            startPos.Y.Offset + delta.Y
        )
    end

    frame.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
            dragging = true
            dragStart = input.Position
            startPos = frame.Position
            
            local connection
            connection = input.Changed:Connect(function()
                if input.UserInputState == Enum.UserInputState.End then
                    dragging = false
                    connection:Disconnect()
                end
            end)
        end
    end)

    frame.InputChanged:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
            if dragging then
                update(input)
            end
        end
    end)
end

-- GUI
local screenGui = Instance.new("ScreenGui")
screenGui.Parent = player:WaitForChild("PlayerGui")
screenGui.ResetOnSpawn = false

-- Botão principal
local mainButton = Instance.new("TextButton")
mainButton.Size = UDim2.new(0, 50, 0, 50)
mainButton.Position = UDim2.new(0.5, -25, 0.85, -25)
mainButton.Text = "⚙"
mainButton.BackgroundColor3 = Color3.fromRGB(0, 140, 255)
mainButton.TextColor3 = Color3.new(1,1,1)
mainButton.Font = Enum.Font.GothamBold
mainButton.TextScaled = true
mainButton.Parent = screenGui

local mainCorner = Instance.new("UICorner", mainButton)
mainCorner.CornerRadius = UDim.new(0, 12)

makeDraggable(mainButton)

-- Menu
local menu = Instance.new("Frame")
menu.Size = UDim2.new(0, 300, 0, 220)
menu.Position = UDim2.new(0.5, -150, 0.5, -110)
menu.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
menu.BackgroundTransparency = 0.1
menu.BorderSizePixel = 0
menu.Visible = false
menu.Parent = screenGui

local menuCorner = Instance.new("UICorner", menu)
menuCorner.CornerRadius = UDim.new(0, 15)

makeDraggable(menu)

-- Título
local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, -60, 0, 40)
title.Position = UDim2.new(0, 10, 0, 5)
title.Text = "CAR TUNING"
title.BackgroundTransparency = 1
title.TextColor3 = Color3.fromRGB(0, 140, 255)
title.Font = Enum.Font.GothamBold
title.TextSize = 24
title.Parent = menu

-- Botão Fechar
local closeButton = Instance.new("TextButton")
closeButton.Size = UDim2.new(0, 30, 0, 30)
closeButton.Position = UDim2.new(1, -40, 0, 10)
closeButton.Text = "X"
closeButton.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
closeButton.TextColor3 = Color3.new(1,1,1)
closeButton.Font = Enum.Font.GothamBold
closeButton.TextScaled = true
closeButton.Parent = menu

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

-- Botões Frente/Trás
local fwButton = Instance.new("TextButton")
fwButton.Size = UDim2.new(0, 100, 0, 70)
fwButton.Position = UDim2.new(0, 15, 0, 50)
fwButton.Text = "Frente"
fwButton.BackgroundColor3 = Color3.fromRGB(40, 40, 55)
fwButton.TextColor3 = Color3.new(1,1,1)
fwButton.Font = Enum.Font.GothamBold
fwButton.TextScaled = true
fwButton.Parent = menu

local bwButton = Instance.new("TextButton")
bwButton.Size = UDim2.new(0, 100, 0, 70)
bwButton.Position = UDim2.new(0, 15, 0, 130)
bwButton.Text = "Trás"
bwButton.BackgroundColor3 = Color3.fromRGB(40, 40, 55)
bwButton.TextColor3 = Color3.new(1,1,1)
bwButton.Font = Enum.Font.GothamBold
bwButton.TextScaled = true
bwButton.Parent = menu

Instance.new("UICorner", fwButton).CornerRadius = UDim.new(0, 10)
Instance.new("UICorner", bwButton).CornerRadius = UDim.new(0, 10)

-- Linhas de ajuste (layout corrigido e alinhado)
local function createRow(yOffset, name)
    local row = Instance.new("Frame")
    row.Size = UDim2.new(0, 170, 0, 50)
    row.Position = UDim2.new(0, 115, 0, yOffset)
    row.BackgroundTransparency = 1
    row.Parent = menu

    local minus = Instance.new("TextButton")
    minus.Size = UDim2.new(0, 45, 1, 0)
    minus.Position = UDim2.new(0, 0, 0, 0)
    minus.Text = "−"
    minus.BackgroundColor3 = Color3.fromRGB(70, 70, 85)
    minus.TextColor3 = Color3.new(1,1,1)
    minus.Font = Enum.Font.GothamBold
    minus.TextScaled = true
    minus.Parent = row

    local valueLabel = Instance.new("TextLabel")
    valueLabel.Size = UDim2.new(0, 80, 1, 0)
    valueLabel.Position = UDim2.new(0, 45, 0, 0)
    valueLabel.Text = name .. " 0.000"
    valueLabel.BackgroundTransparency = 1
    valueLabel.TextColor3 = Color3.new(1,1,1)
    valueLabel.Font = Enum.Font.Gotham
    valueLabel.TextScaled = true
    valueLabel.Parent = row

    local plus = Instance.new("TextButton")
    plus.Size = UDim2.new(0, 45, 1, 0)
    plus.Position = UDim2.new(0, 125, 0, 0)
    plus.Text = "+"
    plus.BackgroundColor3 = Color3.fromRGB(70, 70, 85)
    plus.TextColor3 = Color3.new(1,1,1)
    plus.Font = Enum.Font.GothamBold
    plus.TextScaled = true
    plus.Parent = row

    Instance.new("UICorner", minus).CornerRadius = UDim.new(0, 8)
    Instance.new("UICorner", plus).CornerRadius = UDim.new(0, 8)

    return minus, valueLabel, plus
end

local camber_minus, camber_label, camber_plus = createRow(50, "Camber:")
local offsetx_minus, offsetx_label, offsetx_plus = createRow(105, "Offset X:")
local heighty_minus, heighty_label, heighty_plus = createRow(160, "Height Y:")

-- Funções de aplicação
local function applyCamberDelta(group, deltaAngle)
    for _, steer in ipairs(group.right) do
        local cf = steer.CFrame
        steer.CFrame = cf * CFrame.fromAxisAngle(cf.LookVector, deltaAngle)
    end
    for _, steer in ipairs(group.left) do
        local cf = steer.CFrame
        steer.CFrame = cf * CFrame.fromAxisAngle(cf.LookVector, -deltaAngle)
    end
end

local function applyOffsetXDelta(group, delta)
    for _, steer in ipairs(group.right) do
        local cf = steer.CFrame
        steer.CFrame = CFrame.new(cf.Position + Vector3.new(delta, 0, 0)) * (cf - cf.Position)
    end
    for _, steer in ipairs(group.left) do
        local cf = steer.CFrame
        steer.CFrame = CFrame.new(cf.Position + Vector3.new(-delta, 0, 0)) * (cf - cf.Position)
    end
end

local function applyHeightYDelta(group, delta)
    local allSteers = {}
    for _, s in ipairs(group.right) do table.insert(allSteers, s) end
    for _, s in ipairs(group.left) do table.insert(allSteers, s) end
    for _, steer in ipairs(allSteers) do
        local cf = steer.CFrame
        steer.CFrame = CFrame.new(cf.Position + Vector3.new(0, delta, 0)) * (cf - cf.Position)
    end
end

-- Atualizar valores exibidos
function updateValues()
    local group = groups[current_mode]
    local hasWheels = #group.right > 0 or #group.left > 0

    if not hasWheels or not myCar then
        camber_label.Text = "Camber: ---"
        offsetx_label.Text = "Offset X: ---"
        heighty_label.Text = "Height Y: ---"
        return
    end

    local camberSum, camberCount = 0, 0
    for _, steer in ipairs(group.right) do
        camberSum += steer.CFrame.RightVector.X
        camberCount += 1
    end
    local avgCamber = camberCount > 0 and (camberSum / camberCount) or 0
    camber_label.Text = string.format("Camber: %.3f", avgCamber)

    local xSum, xCount = 0, 0
    for _, steer in ipairs(group.right) do
        xSum += steer.CFrame.Position.X
        xCount += 1
    end
    local avgX = xCount > 0 and (xSum / xCount) or 0
    offsetx_label.Text = string.format("Offset X: %.3f", avgX)

    local ySum, yCount = 0, 0
    for _, steer in ipairs(group.right) do
        ySum += steer.CFrame.Position.Y
        yCount += 1
    end
    for _, steer in ipairs(group.left) do
        ySum += steer.CFrame.Position.Y
        yCount += 1
    end
    local avgY = yCount > 0 and (ySum / yCount) or 0
    heighty_label.Text = string.format("Height Y: %.3f", avgY)
end

-- Conexões
mainButton.Activated:Connect(function()
    menu.Visible = not menu.Visible
    if menu.Visible then
        updateCurrentCar()
        updateValues()
    end
end)

closeButton.Activated:Connect(function()
    menu.Visible = false
end)

fwButton.Activated:Connect(function()
    current_mode = "front"
    updateValues()
end)

bwButton.Activated:Connect(function()
    current_mode = "back"
    updateValues()
end)

camber_plus.Activated:Connect(function() applyCamberDelta(groups[current_mode], 0.1) updateValues() end)
camber_minus.Activated:Connect(function() applyCamberDelta(groups[current_mode], -0.1) updateValues() end)

offsetx_plus.Activated:Connect(function() applyOffsetXDelta(groups[current_mode], 0.1) updateValues() end)
offsetx_minus.Activated:Connect(function() applyOffsetXDelta(groups[current_mode], -0.1) updateValues() end)

heighty_plus.Activated:Connect(function() applyHeightYDelta(groups[current_mode], 0.1) updateValues() end)
heighty_minus.Activated:Connect(function() applyHeightYDelta(groups[current_mode], -0.1) updateValues() end)

-- Loop de verificação de troca de carro
spawn(function()
    while true do
        task.wait(2)
        updateCurrentCar()
    end
end)

-- Inicial
updateCurrentCar()

-- Atualizado dia 29/05/2026

Features & Information

-- Script Lua para Roblox - Menu de Tuning de Cambagem e Posição (Camber/Offset/Height) -- Correção principal: Drag agora CONTINUA arrastando mesmo se o dedo/mouse sair do botão ou do menu -- (comportamento correto para mobile e PC - só para de arrastar quando você SOLTA o botão/dedo) -- • Drag refeito usando UserInputService global (melhor método do Roblox) -- • Testado: funciona perfeitamente em mobile (dedo sai do botão → continua movendo) e PC -- • Executar com Xeno Executor local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local player = Players.LocalPlayer local workspace = game.Workspace local carsFolder = workspace:FindFirstChild("Cars") or workspace:WaitForChild("Cars", 10) if not carsFolder then warn("Pasta Cars não encontrada") return end local myCar = nil local groups = { front = {right = {}, left = {}}, back = {right = {}, left = {}} } local current_mode = "front" -- Função para coletar Steers local function collectSteers(carModel) local function get(name) local list = {} for _, obj in ipairs(carModel:GetDescendants()) do if obj.Name == name and obj:FindFirstChild("Axel") then local steer = obj.Axel:FindFirstChild("Steer") if steer and steer:IsA("Attachment") then table.insert(list, steer) end end end return list end return { front = {right = get("FR"), left = get("FL")}, back = {right = get("RR"), left = get("RL")} } end -- Função para encontrar o carro atual do player local function updateCurrentCar() local foundCar = nil for _, model in ipairs(carsFolder:GetChildren()) do if model:IsA("Model") then local stats = model:FindFirstChild("Stats") if stats then local owner = stats:FindFirstChild("Owner") if owner then if (owner:IsA("ObjectValue") and owner.Value == player) or (owner:IsA("StringValue") and owner.Value == player.Name) then foundCar = model break end end end end end if foundCar ~= myCar then myCar = foundCar if myCar then local steers = collectSteers(myCar) groups.front = steers.front groups.back = steers.back else groups.front = {right = {}, left = {}} groups.back = {right = {}, left = {}} end updateValues() end end -- Draggable CORRIGIDO (continua arrastando mesmo se sair do botão/menu) local function makeDraggable(frame) local dragging = false local dragStart = nil local startPos = nil local inputConnection = nil frame.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPos = frame.Position -- Conecta ao UserInputService global para continuar mesmo se sair do frame inputConnection = UserInputService.InputChanged:Connect(function(input2) if input2.UserInputType == Enum.UserInputType.MouseMovement or input2.UserInputType == Enum.UserInputType.Touch then local delta = input2.Position - dr
#CDT#Car Dealership Tycoon

Community Comments (0)

No comments yet for this script.

More Scripts for Car Dealership Tycoon [🚗]