-- Speed Control UI - MOBILE & PC COMPATIBLE -- LocalScript local Players = game:GetService("Players") local UIS = game:GetService("UserInputService") local TweenService = game:GetService("TweenService") local RunService = game:GetService("RunService") local player = Players.LocalPlayer local playerGui = player:WaitForChild("PlayerGui") -- ============== CONFIG ============== local WIDTH, HEIGHT = 340, 180 local COLLAPSED_WIDTH, COLLAPSED_HEIGHT = 180, 40 local MIN_SPEED = 1 local MAX_SPEED = 500 local NORMAL_SPEED = 16 -- ============== STATE ============== local targetSpeed = NORMAL_SPEED local savedSpeed = NORMAL_SPEED local scriptEnabled = false local minimized = true local humanoid local heartbeatConnection local detectedSpeeds = {} -- Detectar múltiples velocidades local detectionActive = true -- ============== CLEAN OLD UI ============== local old = playerGui:FindFirstChild("SpeedUI") if old then old:Destroy() end -- ============== GUI ROOT ============== local gui = Instance.new("ScreenGui") gui.Name = "SpeedUI" gui.ResetOnSpawn = false gui.Parent = playerGui local frame = Instance.new("Frame") frame.Size = UDim2.fromOffset(COLLAPSED_WIDTH, COLLAPSED_HEIGHT) frame.Position = UDim2.fromScale(0.5, 0.4) frame.AnchorPoint = Vector2.new(0.5, 0.5) frame.BackgroundColor3 = Color3.fromRGB(24, 24, 24) frame.BorderSizePixel = 0 frame.Active = true frame.Parent = gui Instance.new("UICorner", frame).CornerRadius = UDim.new(0, 14) -- ============== TOP BAR (DRAGGABLE AREA) ============== local topBar = Instance.new("Frame") topBar.Size = UDim2.new(1, 0, 0, 40) topBar.BackgroundColor3 = Color3.fromRGB(35, 35, 35) topBar.BorderSizePixel = 0 topBar.Parent = frame Instance.new("UICorner", topBar).CornerRadius = UDim.new(0, 14) local title = Instance.new("TextLabel") title.Text = "Speed Control" title.Font = Enum.Font.GothamBold title.TextSize = 16 title.TextColor3 = Color3.fromRGB(255, 255, 255) title.BackgroundTransparency = 1 title.Size = UDim2.new(1, -60, 1, 0) title.Position = UDim2.fromOffset(15, 0) title.TextXAlignment = Enum.TextXAlignment.Left title.Parent = topBar local minimizeBtn = Instance.new("TextButton") minimizeBtn.Size = UDim2.fromOffset(30, 30) minimizeBtn.Position = UDim2.new(1, -35, 0.5, -15) minimizeBtn.Text = "+" minimizeBtn.Font = Enum.Font.GothamBold minimizeBtn.TextSize = 24 minimizeBtn.BackgroundColor3 = Color3.fromRGB(50, 50, 50) minimizeBtn.TextColor3 = Color3.fromRGB(255, 255, 255) minimizeBtn.BorderSizePixel = 0 minimizeBtn.Parent = topBar Instance.new("UICorner", minimizeBtn).CornerRadius = UDim.new(1, 0) -- ============== CONTENT ============== local content = Instance.new("Frame") content.Position = UDim2.fromOffset(0, 40) content.Size = UDim2.new(1, 0, 1, -40) content.BackgroundTransparency = 1 content.ClipsDescendants = true content.Visible = false content.Parent = frame -- Slider local sliderBack = Instance.new("Frame") sliderBack.Size = UDim2.new(1, -40, 0, 8) sliderBack.Position = UDim2.fromOffset(20, 30) sliderBack.BackgroundColor3 = Color3.fromRGB(60, 60, 60) sliderBack.Parent = content Instance.new("UICorner", sliderBack).CornerRadius = UDim.new(1, 0) local sliderFill = Instance.new("Frame") sliderFill.Size = UDim2.new(0, 0, 1, 0) sliderFill.BackgroundColor3 = Color3.fromRGB(0, 170, 255) sliderFill.Parent = sliderBack Instance.new("UICorner", sliderFill).CornerRadius = UDim.new(1, 0) local knob = Instance.new("Frame") knob.Size = UDim2.fromOffset(20, 20) knob.Position = UDim2.new(0, -10, 0.5, -10) knob.BackgroundColor3 = Color3.fromRGB(255, 255, 255) knob.Parent = sliderBack Instance.new("UICorner", knob).CornerRadius = UDim.new(1, 0) local valueLabel = Instance.new("TextLabel") valueLabel.Position = UDim2.fromOffset(20, 50) valueLabel.Size = UDim2.new(1, -40, 0, 20) valueLabel.BackgroundTransparency = 1 valueLabel.Text = "Speed: 16" valueLabel.Font = Enum.Font.GothamBold valueLabel.TextSize = 16 valueLabel.TextColor3 = Color3.fromRGB(255, 255, 255) valueLabel.TextXAlignment = Enum.TextXAlignment.Left valueLabel.Parent = content local toggleBtn = Instance.new("TextButton") toggleBtn.Size = UDim2.fromOffset(140, 30) toggleBtn.Position = UDim2.fromOffset(20, 85) toggleBtn.BackgroundColor3 = Color3.fromRGB(150, 50, 50) toggleBtn.Text = "Status: OFF" toggleBtn.Font = Enum.Font.GothamBold toggleBtn.TextSize = 16 toggleBtn.TextColor3 = Color3.fromRGB(255, 255, 255) toggleBtn.Parent = content Instance.new("UICorner", toggleBtn).CornerRadius = UDim.new(0, 6) local resetBtn = Instance.new("TextButton") resetBtn.Size = UDim2.fromOffset(80, 30) resetBtn.Position = UDim2.fromOffset(240, 85) resetBtn.BackgroundColor3 = Color3.fromRGB(60, 60, 60) resetBtn.Text = "Reset" resetBtn.Font = Enum.Font.GothamBold resetBtn.TextSize = 16 resetBtn.TextColor3 = Color3.fromRGB(255, 255, 255) resetBtn.Parent = content Instance.new("UICorner", resetBtn).CornerRadius = UDim.new(0, 6) -- ============== CLAMP POSITION TO SCREEN ============== local function clampFrameToScreen() local screenSize = frame.Parent.AbsoluteSize local frameSize = frame.AbsoluteSize local posX = frame.Position.X.Offset local posY = frame.Position.Y.Offset local margin = 10 if posX - frameSize.X / 2 < margin then posX = frameSize.X / 2 + margin elseif posX + frameSize.X / 2 > screenSize.X - margin then posX = screenSize.X - frameSize.X / 2 - margin end if posY - frameSize.Y / 2 < margin then posY = frameSize.Y / 2 + margin elseif posY + frameSize.Y / 2 > screenSize.Y - margin then posY = screenSize.Y - frameSize.Y / 2 - margin end frame.Position = UDim2.new(0, posX, 0, posY) end -- ============== UNIVERSAL DRAG SYSTEM (MOBILE/PC) ============== local function makeDraggable(obj, target) local dragging, dragStart, startPos obj.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPos = target.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false clampFrameToScreen() end end) end end) UIS.InputChanged:Connect(function(input) if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then local delta = input.Position - dragStart target.Position = UDim2.new(0, startPos.X.Offset + delta.X, 0, startPos.Y.Offset + delta.Y) end end) end makeDraggable(topBar, frame) -- ============== SLIDER LOGIC ============== local function updateSlider(p) local p = math.clamp(p, 0, 1) local speed = math.floor(MIN_SPEED + (MAX_SPEED - MIN_SPEED) * p + 0.5) targetSpeed = speed savedSpeed = speed sliderFill.Size = UDim2.new(p, 0, 1, 0) knob.Position = UDim2.new(p, -10, 0.5, -10) valueLabel.Text = "Speed: " .. speed end local sliderActive = false local function handleSlider(input) local ap = sliderBack.AbsolutePosition local as = sliderBack.AbsoluteSize local percentage = (input.Position.X - ap.X) / as.X updateSlider(percentage) end sliderBack.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then sliderActive = true handleSlider(input) end end) UIS.InputChanged:Connect(function(input) if sliderActive and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then handleSlider(input) end end) UIS.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then sliderActive = false end end) -- ============== TOGGLE ============== local function updateStatus() if scriptEnabled then toggleBtn.Text = "Status: ON" toggleBtn.BackgroundColor3 = Color3.fromRGB(0, 170, 255) else toggleBtn.Text = "Status: OFF" toggleBtn.BackgroundColor3 = Color3.fromRGB(150, 50, 50) end end local function enableScript() scriptEnabled = true detectionActive = false -- Dejar de detectar cuando está activo updateStatus() if heartbeatConnection then heartbeatConnection:Disconnect() end heartbeatConnection = RunService.Heartbeat:Connect(function() local char = player.Character if char then humanoid = char:FindFirstChildOfClass("Humanoid") if humanoid then humanoid.WalkSpeed = targetSpeed end end end) end local function disableScript() scriptEnabled = false updateStatus() if heartbeatConnection then heartbeatConnection:Disconnect() heartbeatConnection = nil end -- Restaurar todas las velocidades detectadas local char = player.Character if char then humanoid = char:FindFirstChildOfClass("Humanoid") if humanoid then -- Si se detectaron múltiples velocidades, restaurar la menor (caminar) if #detectedSpeeds > 0 then table.sort(detectedSpeeds) humanoid.WalkSpeed = detectedSpeeds[1] end end end -- Reactivar detección después de 2 segundos detectionActive = true end toggleBtn.MouseButton1Click:Connect(function() if scriptEnabled then disableScript() else enableScript() end end) minimizeBtn.MouseButton1Click:Connect(function() minimized = not minimized content.Visible = not minimized local targetSize = minimized and UDim2.fromOffset(COLLAPSED_WIDTH, COLLAPSED_HEIGHT) or UDim2.fromOffset(WIDTH, HEIGHT) TweenService:Create(frame, TweenInfo.new(0.3), {Size = targetSize}):Play() minimizeBtn.Text = minimized and "+" or "–" task.wait(0.3) clampFrameToScreen() end) resetBtn.MouseButton1Click:Connect(function() updateSlider((NORMAL_SPEED - MIN_SPEED) / (MAX_SPEED - MIN_SPEED)) end) -- PC Hotkey (CTRL) UIS.InputBegan:Connect(function(input, gp) if gp then return end if input.KeyCode == Enum.KeyCode.LeftControl then if scriptEnabled then disableScript() else enableScript() end end end) -- ============== DETECT MULTIPLE SPEEDS ============== RunService.Heartbeat:Connect(function() if detectionActive and not scriptEnabled then local char = player.Character if char then humanoid = char:FindFirstChildOfClass("Humanoid") if humanoid then local currentSpeed = humanoid.WalkSpeed -- Agregar velocidad si es diferente de las detectadas local isNew = true for _, speed in ipairs(detectedSpeeds) do if math.abs(speed - currentSpeed) < 0.1 then isNew = false break end end if isNew and currentSpeed > 0 then table.insert(detectedSpeeds, currentSpeed) end end end end end) -- Init updateSlider((NORMAL_SPEED - MIN_SPEED) / (MAX_SPEED - MIN_SPEED)) updateStatus() clampFrameToScreen()