-- Speed Loop GUI Script (Touchscreen + Persistent + FOV + AutoRespawn) -- Put this in StarterGui > LocalScript local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local player = Players.LocalPlayer local camera = workspace.CurrentCamera local defaultFOV = 70 -- Roblox default FOV -- Create ScreenGui local screenGui = Instance.new("ScreenGui") screenGui.Name = "SpeedLoopGui" screenGui.ResetOnSpawn = false -- GUI stays after respawn screenGui.Parent = player:WaitForChild("PlayerGui") -- Main Frame local frame = Instance.new("Frame") frame.Size = UDim2.new(0, 200, 0, 120) frame.Position = UDim2.new(0.3, 0, 0.3, 0) frame.BackgroundColor3 = Color3.fromRGB(30, 30, 30) frame.BorderSizePixel = 2 frame.Active = true frame.Parent = screenGui -- Rounded corners local uiCorner = Instance.new("UICorner") uiCorner.CornerRadius = UDim.new(0, 12) uiCorner.Parent = frame -- Title local title = Instance.new("TextLabel") title.Size = UDim2.new(1, 0, 0, 30) title.BackgroundTransparency = 1 title.Text = "Speed Loop GUI" title.TextColor3 = Color3.fromRGB(255, 255, 255) title.Font = Enum.Font.SourceSansBold title.TextSize = 18 title.Parent = frame -- Start Button local startBtn = Instance.new("TextButton") startBtn.Size = UDim2.new(1, -20, 0, 30) startBtn.Position = UDim2.new(0, 10, 0, 40) startBtn.Text = "Start" startBtn.BackgroundColor3 = Color3.fromRGB(50, 170, 50) startBtn.TextColor3 = Color3.fromRGB(255, 255, 255) startBtn.Font = Enum.Font.SourceSansBold startBtn.TextSize = 16 startBtn.Parent = frame -- Pause Button local pauseBtn = Instance.new("TextButton") pauseBtn.Size = UDim2.new(1, -20, 0, 30) pauseBtn.Position = UDim2.new(0, 10, 0, 75) pauseBtn.Text = "Pause" pauseBtn.BackgroundColor3 = Color3.fromRGB(200, 120, 50) pauseBtn.TextColor3 = Color3.fromRGB(255, 255, 255) pauseBtn.Font = Enum.Font.SourceSansBold pauseBtn.TextSize = 16 pauseBtn.Parent = frame -- Close Button local closeBtn = Instance.new("TextButton") closeBtn.Size = UDim2.new(0, 25, 0, 25) closeBtn.Position = UDim2.new(1, -30, 0, 5) closeBtn.Text = "X" closeBtn.BackgroundColor3 = Color3.fromRGB(170, 50, 50) closeBtn.TextColor3 = Color3.fromRGB(255, 255, 255) closeBtn.Font = Enum.Font.SourceSansBold closeBtn.TextSize = 14 closeBtn.Parent = frame -- Dragging (works for mouse + touch) local dragging, dragInput, dragStart, startPos 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 input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) end end) frame.InputChanged:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then dragInput = input end end) UserInputService.InputChanged:Connect(function(input) if input == dragInput and dragging then update(input) end end) -- Speed loop logic local running = false local paused = false local function getHumanoid() local character = player.Character or player.CharacterAdded:Wait() return character:FindFirstChildOfClass("Humanoid") end local function speedLoop() running = true while running do if not paused then local humanoid = getHumanoid() if humanoid then humanoid.WalkSpeed = 64 end end task.wait(0.2) end end -- Auto-restore after respawn player.CharacterAdded:Connect(function() if running and not paused then task.wait(1) -- small delay so character loads local humanoid = getHumanoid() if humanoid then humanoid.WalkSpeed = 64 end camera.FieldOfView = 120 end end) -- Buttons startBtn.MouseButton1Click:Connect(function() if not running then paused = false camera.FieldOfView = 120 coroutine.wrap(speedLoop)() else -- if already running but paused, pressing start will force resume paused = false pauseBtn.Text = "Pause" camera.FieldOfView = 120 end end) pauseBtn.MouseButton1Click:Connect(function() paused = not paused if paused then pauseBtn.Text = "Resume" camera.FieldOfView = defaultFOV else pauseBtn.Text = "Pause" camera.FieldOfView = 120 end end) closeBtn.MouseButton1Click:Connect(function() running = false camera.FieldOfView = defaultFOV screenGui:Destroy() end)