-- LocalScript inside StarterPlayerScripts local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local player = Players.LocalPlayer -- Keep references up to date when character spawns local char = player.Character or player.CharacterAdded:Wait() local function getHRP(c) if not c then return nil end return c:FindFirstChild("HumanoidRootPart") end local hrp = getHRP(char) -- GUI creation (reuse if already present) local playerGui = player:WaitForChild("PlayerGui") local screenGui = playerGui:FindFirstChild("SpeedControlGui") if not screenGui then screenGui = Instance.new("ScreenGui") screenGui.Name = "SpeedControlGui" screenGui.ResetOnSpawn = false screenGui.Parent = playerGui end local frame = screenGui:FindFirstChild("Container") if not frame then frame = Instance.new("Frame") frame.Name = "Container" frame.Size = UDim2.new(0, 220, 0, 70) frame.Position = UDim2.new(0, 12, 0, 12) frame.BackgroundTransparency = 0.25 frame.BackgroundColor3 = Color3.fromRGB(20, 20, 20) frame.BorderSizePixel = 0 frame.Parent = screenGui end local function getOrCreate(class, parent, props) local obj = parent:FindFirstChild(props.Name) if obj and obj:IsA(class) then return obj end obj = Instance.new(class) for k,v in pairs(props) do if k ~= "Name" then obj[k] = v end end obj.Name = props.Name obj.Parent = parent return obj end -- Title (we'll use this as the drag handle) local title = getOrCreate("TextLabel", frame, { Name = "Title", Size = UDim2.new(1, -12, 0, 20), Position = UDim2.new(0, 6, 0, 6), BackgroundTransparency = 1, TextColor3 = Color3.fromRGB(255,255,255), Font = Enum.Font.SourceSansBold, TextSize = 14, Text = "CFrame Speed", TextXAlignment = Enum.TextXAlignment.Left }) local valueLabel = getOrCreate("TextLabel", frame, { Name = "ValueLabel", Size = UDim2.new(1, -12, 0, 18), Position = UDim2.new(0, 6, 0, 26), BackgroundTransparency = 1, TextColor3 = Color3.fromRGB(200,200,200), Font = Enum.Font.SourceSans, TextSize = 14, Text = "Current: 0.09", TextXAlignment = Enum.TextXAlignment.Left }) local inputBox = getOrCreate("TextBox", frame, { Name = "SpeedBox", Size = UDim2.new(0, 80, 0, 24), Position = UDim2.new(1, -86, 0, 22), AnchorPoint = Vector2.new(0,0), BackgroundColor3 = Color3.fromRGB(255,255,255), BackgroundTransparency = 0.9, TextColor3 = Color3.fromRGB(0,0,0), Font = Enum.Font.SourceSans, TextSize = 14, PlaceholderText = "speed", ClearTextOnFocus = false }) -- default global speed _G.CFrameSpeed = _G.CFrameSpeed or 0.09 -- helper to update GUI display local function updateGui() valueLabel.Text = "Current: " .. tostring(_G.CFrameSpeed) if not inputBox:IsFocused() then inputBox.Text = tostring(_G.CFrameSpeed) end end updateGui() -- validate and apply new speed local function applySpeed(text) local n = tonumber(text) if not n then updateGui() return end if n < 0 then n = 0 end if n > 5 then n = 5 end _G.CFrameSpeed = n updateGui() end inputBox.FocusLost:Connect(function(enterPressed) applySpeed(inputBox.Text) end) -- Movement keys local keys = { W = false, A = false, S = false, D = false } UserInputService.InputBegan:Connect(function(input, gameProcessed) if gameProcessed then return end if input.UserInputType == Enum.UserInputType.Keyboard then local key = input.KeyCode.Name if keys[key] ~= nil then keys[key] = true end end end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.Keyboard then local key = input.KeyCode.Name if keys[key] ~= nil then keys[key] = false end end end) player.CharacterAdded:Connect(function(newChar) char = newChar hrp = char:WaitForChild("HumanoidRootPart") pcall(function() UserInputService:SetFocusedTextBox(nil) end) for k,_ in pairs(keys) do keys[k] = false end updateGui() end) -- ⭐ FIXED MOVEMENT LOOP (S key now moves perfectly straight) RunService.RenderStepped:Connect(function() if not hrp or not hrp.Parent then char = player.Character or player.CharacterAdded:Wait() hrp = char:WaitForChild("HumanoidRootPart") end local cam = workspace.CurrentCamera local forward = cam.CFrame.LookVector local right = cam.CFrame.RightVector forward = Vector3.new(forward.X, 0, forward.Z).Unit right = Vector3.new(right.X, 0, right.Z).Unit local move = Vector3.zero if keys.W then move += forward end if keys.S then move -= forward end if keys.A then move -= right end if keys.D then move += right end if move.Magnitude > 0 then hrp.CFrame = hrp.CFrame + move.Unit * _G.CFrameSpeed * 0.1 end end) -- Draggable behavior for the frame using the title as the handle do local dragging = false local dragInput = nil local dragStart = nil local startPos = nil local function update(input) if not dragging or not dragStart or not startPos then return end local delta = input.Position - dragStart local newX = startPos.X.Offset + delta.X local newY = startPos.Y.Offset + delta.Y local screenSize = workspace.CurrentCamera and workspace.CurrentCamera.ViewportSize or Vector2.new(1920,1080) local fw = frame.AbsoluteSize.X local fh = frame.AbsoluteSize.Y if newX < 0 then newX = 0 end if newY < 0 then newY = 0 end if newX + fw > screenSize.X then newX = screenSize.X - fw end if newY + fh > screenSize.Y then newY = screenSize.Y - fh end frame.Position = UDim2.new(0, newX, 0, newY) end title.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 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 update(input) end end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false end end) end