-- Player Spectator Script -- Script by: JigglingCheeks local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local LocalPlayer = Players.LocalPlayer local Camera = workspace.CurrentCamera local screenGui = Instance.new("ScreenGui") screenGui.Name = "SpectatorGui" screenGui.ResetOnSpawn = false screenGui.Parent = LocalPlayer:WaitForChild("PlayerGui") local isSpectating = false local currentTarget = nil -- Main Draggable Button local mainButton = Instance.new("TextButton") mainButton.Size = UDim2.new(0, 120, 0, 40) mainButton.Position = UDim2.new(0, 700, 0, 320) mainButton.BackgroundColor3 = Color3.fromRGB(30, 30, 30) mainButton.Text = "Player List" mainButton.TextColor3 = Color3.new(1, 1, 1) mainButton.TextScaled = true mainButton.Font = Enum.Font.SourceSansBold mainButton.Parent = screenGui local mainCorner = Instance.new("UICorner") mainCorner.CornerRadius = UDim.new(0, 8) mainCorner.Parent = mainButton -- Cancel Button local cancelButton = Instance.new("TextButton") cancelButton.Size = UDim2.new(0, 140, 0, 40) cancelButton.BackgroundColor3 = Color3.fromRGB(170, 0, 0) cancelButton.Text = "Cancel Spectating" cancelButton.TextColor3 = Color3.new(1, 1, 1) cancelButton.TextScaled = true cancelButton.Font = Enum.Font.SourceSansBold cancelButton.Visible = false cancelButton.Parent = screenGui local cancelCorner = Instance.new("UICorner") cancelCorner.CornerRadius = UDim.new(0, 8) cancelCorner.Parent = cancelButton -- Player List Frame local listFrame = Instance.new("Frame") listFrame.Size = UDim2.new(0, 220, 0, 320) listFrame.BackgroundColor3 = Color3.fromRGB(25, 25, 25) listFrame.Visible = false listFrame.Parent = screenGui local listCorner = Instance.new("UICorner") listCorner.CornerRadius = UDim.new(0, 8) listCorner.Parent = listFrame local scrolling = Instance.new("ScrollingFrame") scrolling.Size = UDim2.new(1, -10, 1, -10) scrolling.Position = UDim2.new(0, 5, 0, 5) scrolling.BackgroundTransparency = 1 scrolling.ScrollBarThickness = 6 scrolling.Parent = listFrame local listLayout = Instance.new("UIListLayout") listLayout.SortOrder = Enum.SortOrder.Name listLayout.Padding = UDim.new(0, 4) listLayout.Parent = scrolling local function updateListPosition() if listFrame.Visible then local buttonPos = mainButton.AbsolutePosition local buttonSize = mainButton.AbsoluteSize listFrame.Position = UDim2.new(0, buttonPos.X, 0, buttonPos.Y + buttonSize.Y + 5) end end local function updateCancelPosition() if cancelButton.Visible then local mainPos = mainButton.AbsolutePosition local mainSize = mainButton.AbsoluteSize cancelButton.Position = UDim2.new(0, mainPos.X - cancelButton.Size.X.Offset - 8, 0, mainPos.Y) end end -- Improved Click + Drag System mainButton.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then local startMousePos = input.Position local startButtonPos = mainButton.Position local isDragging = false local clickTime = tick() local moveConn = UserInputService.InputChanged:Connect(function(inp) if inp.UserInputType == Enum.UserInputType.MouseMovement then local delta = (inp.Position - startMousePos).Magnitude if delta > 6 then -- Small threshold isDragging = true local newPos = UDim2.new( startButtonPos.X.Scale, startButtonPos.X.Offset + (inp.Position.X - startMousePos.X), startButtonPos.Y.Scale, startButtonPos.Y.Offset + (inp.Position.Y - startMousePos.Y) ) mainButton.Position = newPos updateListPosition() updateCancelPosition() end end end) local releaseConn releaseConn = UserInputService.InputEnded:Connect(function(inp) if inp.UserInputType == Enum.UserInputType.MouseButton1 then moveConn:Disconnect() releaseConn:Disconnect() if not isDragging and (tick() - clickTime) < 0.4 then -- Real click detected listFrame.Visible = not listFrame.Visible if listFrame.Visible then updatePlayerList() updateListPosition() end end end end) end end) -- Update Player List local function updatePlayerList() for _, child in pairs(scrolling:GetChildren()) do if child:IsA("TextButton") then child:Destroy() end end for _, plr in ipairs(Players:GetPlayers()) do if plr ~= LocalPlayer then local btn = Instance.new("TextButton") btn.Size = UDim2.new(1, 0, 0, 35) btn.BackgroundColor3 = Color3.fromRGB(40, 40, 40) btn.Text = plr.DisplayName btn.TextColor3 = Color3.new(1, 1, 1) btn.TextScaled = true btn.Font = Enum.Font.SourceSans btn.Parent = scrolling local btnCorner = Instance.new("UICorner") btnCorner.CornerRadius = UDim.new(0, 6) btnCorner.Parent = btn btn.MouseButton1Click:Connect(function() if plr.Character and plr.Character:FindFirstChild("Humanoid") then isSpectating = true currentTarget = plr cancelButton.Visible = true Camera.CameraSubject = plr.Character.Humanoid Camera.CameraType = Enum.CameraType.Custom updateCancelPosition() end end) end end scrolling.CanvasSize = UDim2.new(0, 0, 0, listLayout.AbsoluteContentSize.Y) end -- Cancel Spectating cancelButton.MouseButton1Click:Connect(function() isSpectating = false currentTarget = nil cancelButton.Visible = false local myChar = LocalPlayer.Character if myChar and myChar:FindFirstChild("Humanoid") then Camera.CameraSubject = myChar.Humanoid end Camera.CameraType = Enum.CameraType.Custom end) -- Auto Update spawn(function() while true do if listFrame.Visible then updatePlayerList() updateListPosition() end if cancelButton.Visible then updateCancelPosition() end wait(5) end end) Players.PlayerRemoving:Connect(function(plr) if currentTarget == plr then isSpectating = false currentTarget = nil cancelButton.Visible = false local myChar = LocalPlayer.Character if myChar and myChar:FindFirstChild("Humanoid") then Camera.CameraSubject = myChar.Humanoid end Camera.CameraType = Enum.CameraType.Custom end end)