local Players = game:GetService("Players") local RunService = game:GetService("RunService") local Workspace = game:GetService("Workspace") local LocalPlayer = Players.LocalPlayer local Camera = Workspace.CurrentCamera local spectatedPlayer = nil -- ========================================== -- ui shit -- ========================================== local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "SpectateGui" ScreenGui.ResetOnSpawn = false ScreenGui.Parent = LocalPlayer:WaitForChild("PlayerGui") -- ui shit local OpenButton = Instance.new("TextButton") OpenButton.Name = "OpenButton" OpenButton.Size = UDim2.new(0, 100, 0, 35) OpenButton.Position = UDim2.new(0, 15, 0.5, -17.5) OpenButton.BackgroundColor3 = Color3.fromRGB(30, 30, 30) OpenButton.Text = "🎥 Spectate" OpenButton.TextColor3 = Color3.fromRGB(240, 240, 240) OpenButton.Font = Enum.Font.SourceSansBold OpenButton.TextSize = 14 OpenButton.Visible = false OpenButton.Parent = ScreenGui local OpenCorner = Instance.new("UICorner") OpenCorner.CornerRadius = UDim.new(0, 6) OpenCorner.Parent = OpenButton -- ui shit local MainFrame = Instance.new("Frame") MainFrame.Name = "MainFrame" MainFrame.Size = UDim2.new(0, 230, 0, 360) MainFrame.Position = UDim2.new(0, 15, 0.5, -180) MainFrame.BackgroundColor3 = Color3.fromRGB(30, 30, 30) MainFrame.BorderSizePixel = 0 MainFrame.Parent = ScreenGui local MainCorner = Instance.new("UICorner") MainCorner.CornerRadius = UDim.new(0, 8) MainCorner.Parent = MainFrame -- duh local Title = Instance.new("TextLabel") Title.Name = "Title" Title.Size = UDim2.new(1, -40, 0, 35) Title.Position = UDim2.new(0, 10, 0, 0) Title.BackgroundTransparency = 1 Title.Text = "Spectate Universal" Title.TextColor3 = Color3.fromRGB(240, 240, 240) Title.Font = Enum.Font.SourceSansBold Title.TextSize = 18 Title.TextXAlignment = Enum.TextXAlignment.Left Title.Parent = MainFrame -- yeah uh you could tell what is this local CloseButton = Instance.new("TextButton") CloseButton.Name = "CloseButton" CloseButton.Size = UDim2.new(0, 25, 0, 25) CloseButton.Position = UDim2.new(1, -30, 0, 5) CloseButton.BackgroundColor3 = Color3.fromRGB(45, 45, 45) CloseButton.Text = "X" CloseButton.TextColor3 = Color3.fromRGB(180, 180, 180) CloseButton.Font = Enum.Font.SourceSansBold CloseButton.TextSize = 14 CloseButton.Parent = MainFrame local CloseCorner = Instance.new("UICorner") CloseCorner.CornerRadius = UDim.new(0, 4) CloseCorner.Parent = CloseButton -- search bar for you stalkers local SearchBar = Instance.new("TextBox") SearchBar.Name = "SearchBar" SearchBar.Size = UDim2.new(1, -20, 0, 30) SearchBar.Position = UDim2.new(0, 10, 0, 40) SearchBar.BackgroundColor3 = Color3.fromRGB(45, 45, 45) SearchBar.BorderSizePixel = 0 SearchBar.Text = "" SearchBar.PlaceholderText = "Search player..." SearchBar.PlaceholderColor3 = Color3.fromRGB(120, 120, 120) SearchBar.TextColor3 = Color3.fromRGB(255, 255, 255) SearchBar.Font = Enum.Font.SourceSans SearchBar.TextSize = 14 SearchBar.ClearTextOnFocus = false SearchBar.Parent = MainFrame local SearchCorner = Instance.new("UICorner") SearchCorner.CornerRadius = UDim.new(0, 6) SearchCorner.Parent = SearchBar -- ha ha ha, just a SCROLLING FRAME!!! local ScrollingFrame = Instance.new("ScrollingFrame") ScrollingFrame.Name = "PlayerList" ScrollingFrame.Size = UDim2.new(1, -20, 1, -125) ScrollingFrame.Position = UDim2.new(0, 10, 0, 80) ScrollingFrame.BackgroundTransparency = 1 ScrollingFrame.CanvasSize = UDim2.new(0, 0, 0, 0) ScrollingFrame.AutomaticCanvasSize = Enum.AutomaticSize.Y ScrollingFrame.ScrollBarThickness = 6 ScrollingFrame.ScrollBarImageColor3 = Color3.fromRGB(80, 80, 80) ScrollingFrame.Parent = MainFrame local UIListLayout = Instance.new("UIListLayout") UIListLayout.SortOrder = Enum.SortOrder.Name UIListLayout.Padding = UDim.new(0, 6) UIListLayout.Parent = ScrollingFrame -- STOP spectating, NOW! local StopButton = Instance.new("TextButton") StopButton.Name = "StopButton" StopButton.Size = UDim2.new(1, -20, 0, 32) StopButton.Position = UDim2.new(0, 10, 1, -40) StopButton.BackgroundColor3 = Color3.fromRGB(180, 60, 60) StopButton.Text = "Stop Spectating" StopButton.TextColor3 = Color3.fromRGB(255, 255, 255) StopButton.Font = Enum.Font.SourceSansBold StopButton.TextSize = 14 StopButton.Parent = MainFrame local StopCorner = Instance.new("UICorner") StopCorner.CornerRadius = UDim.new(0, 6) StopCorner.Parent = StopButton -- ========================================== -- ui shit -- ========================================== -- close / open CloseButton.MouseButton1Click:Connect(function() MainFrame.Visible = false OpenButton.Visible = true end) OpenButton.MouseButton1Click:Connect(function() MainFrame.Visible = true OpenButton.Visible = false end) local function filterPlayers() local query = string.lower(SearchBar.Text) for _, button in ipairs(ScrollingFrame:GetChildren()) do if button:IsA("TextButton") then if query == "" then button.Visible = true else -- just searches usernames local username = string.lower(button.Name) local displayName = string.lower(button.Text) if string.find(username, query) or string.find(displayName, query) then button.Visible = true else button.Visible = false end end end end end SearchBar:GetPropertyChangedSignal("Text"):Connect(filterPlayers) -- ========================================== -- hey this is just how spectate works aight -- ========================================== local function updateCamera() if spectatedPlayer and spectatedPlayer.Character then local humanoid = spectatedPlayer.Character:FindFirstChildOfClass("Humanoid") if humanoid then Camera.CameraSubject = humanoid return end end local myCharacter = LocalPlayer.Character if myCharacter then local myHumanoid = myCharacter:FindFirstChildOfClass("Humanoid") if myHumanoid and Camera.CameraSubject ~= myHumanoid then Camera.CameraSubject = myHumanoid end end end local function stopSpectating() spectatedPlayer = nil local myCharacter = LocalPlayer.Character if myCharacter then local myHumanoid = myCharacter:FindFirstChildOfClass("Humanoid") if myHumanoid then Camera.CameraSubject = myHumanoid end end end StopButton.MouseButton1Click:Connect(stopSpectating) RunService.RenderStepped:Connect(function() if spectatedPlayer then updateCamera() end end) local function populateList() for _, child in ipairs(ScrollingFrame:GetChildren()) do if child:IsA("TextButton") then child:Destroy() end end for _, player in ipairs(Players:GetPlayers()) do if player ~= LocalPlayer then local PlayerButton = Instance.new("TextButton") PlayerButton.Name = player.Name PlayerButton.Size = UDim2.new(1, 0, 0, 30) PlayerButton.BackgroundColor3 = Color3.fromRGB(50, 50, 50) PlayerButton.Text = player.DisplayName .. " (@" .. player.Name .. ")" PlayerButton.TextColor3 = Color3.fromRGB(255, 255, 255) PlayerButton.Font = Enum.Font.SourceSans PlayerButton.TextSize = 14 PlayerButton.Parent = ScrollingFrame local ButtonCorner = Instance.new("UICorner") ButtonCorner.CornerRadius = UDim.new(0, 4) ButtonCorner.Parent = PlayerButton PlayerButton.MouseButton1Click:Connect(function() spectatedPlayer = player updateCamera() end) end end filterPlayers() end Players.PlayerAdded:Connect(populateList) Players.PlayerRemoving:Connect(function(player) if player == spectatedPlayer then stopSpectating() end populateList() end) populateList()