local cam = workspace.CurrentCamera
local ps = game.Players
local lp = ps.LocalPlayer
local tgt = nil
local function spec(u)
local p = ps:FindFirstChild(u)
if p and p.Character and p.Character:FindFirstChild("Humanoid") then
cam.CameraSubject = p.Character.Humanoid
end
end
local function res()
local c = lp.Character
cam.CameraSubject = c and c:FindFirstChild("Humanoid")
end
local function get()
local t = {}
for _, p in ipairs(ps:GetPlayers()) do
t[#t + 1] = p.Name
end
return t
end
local ui = loadstring(game:HttpGet("https://github.com/Footagesus/WindUI/releases/latest/download/main.lua"))()
ui:SetFont("rbxassetid://12187362578")
local win = ui:CreateWindow({
Title = "Player Spy",
Icon = "door-open",
Folder = "a",
Size = UDim2.fromOffset(580, 460),
Transparent = true,
Theme = "Dark",
SideBarWidth = 200,
Background = "",
})
local tab = win:Tab({
Title = "Main",
Icon = "bird",
Locked = false,
})
local dd = tab:Dropdown({
Title = "Select Player",
Values = get(),
Value = nil,
Callback = function(v)
tgt = v
end
})
ps.PlayerAdded:Connect(function()
dd:Refresh(get())
end)
ps.PlayerRemoving:Connect(function()
dd:Refresh(get())
end)
tab:Button({
Title = "View Player",
Locked = false,
Callback = function()
spec(tgt)
end
})
tab:Button({
Title = "Reset",
Locked = false,
Callback = res
})
Comments
you do not need to ask chatgpt to "make variable names look like real people's, instead of "specateViewer, use "spec" and instead of "targetPlayer", write "tgt"" lol
this is useless script, because you can spectate player with infinite yield /view