Player Joiner Universal Cracked
Key RequiredUniversal

Player Joiner Universal Cracked

Universal Scriptskidded1xskidded1x 287 views 2.8K executesUpdated Jul 24, 2026
Unrated
00
Lua Script•1420 lines (66210 chars)
-- ================================================================
--  Lilly's Snipes  |  discord.gg/7nNG53SHJY
--  Join games by ID, search players, see what world they're in
-- ================================================================

local Players          = game:GetService("Players")
local TeleportService  = game:GetService("TeleportService")
local TweenService     = game:GetService("TweenService")
local UserInputService = game:GetService("UserInputService")
local RunService       = game:GetService("RunService")
local plr              = Players.LocalPlayer

local function notify(t, m, d)
    pcall(function()
        game:GetService("StarterGui"):SetCore("SendNotification",
            {Title = "Lilly's Snipes | " .. t, Text = m, Duration = d or 4})
    end)
end

-- ================================================================
--  COLORS
-- ================================================================
local C = {
    BG    = Color3.fromRGB(6, 3, 14),
    PANEL = Color3.fromRGB(11, 6, 24),
    DARK  = Color3.fromRGB(18, 10, 38),
    ACC   = Color3.fromRGB(110, 22, 230),
    ACC2  = Color3.fromRGB(170, 65, 255),
    ON    = Color3.fromRGB(35, 195, 80),
    OFF   = Color3.fromRGB(165, 25, 25),
    TXT   = Color3.fromRGB(230, 218, 255),
    TXTM  = Color3.fromRGB(140, 120, 175),
    WHT   = Color3.new(1, 1, 1),
    RED   = Color3.fromRGB(200, 30, 30),
    GRN   = Color3.fromRGB(30, 175, 65),
    BLUE  = Color3.fromRGB(32, 100, 200),
    GOLD  = Color3.fromRGB(205, 155, 15),
    TEAL  = Color3.fromRGB(20, 165, 160),
    PINK  = Color3.fromRGB(200, 45, 140),
    ORANGE= Color3.fromRGB(205, 100, 15),
}

-- ================================================================
--  API HELPERS
-- ================================================================
local function getUserId(username)
    if not username or username == "" then return nil end
    local lname = username:lower()
    for _, p2 in ipairs(Players:GetPlayers()) do
        if p2.Name:lower() == lname or p2.DisplayName:lower() == lname then
            return p2.UserId
        end
    end
    local ok, result = pcall(function()
        return Players:GetUserIdFromNameAsync(username)
    end)
    if ok and result then return result end
    local variations = {
        username,
        username:sub(1,1):upper() .. username:sub(2):lower(),
        username:upper(),
        username:lower(),
    }
    for _, v in ipairs(variations) do
        local ok2, result2 = pcall(function()
            return Players:GetUserIdFromNameAsync(v)
        end)
        if ok2 and result2 then return result2 end
    end
    return nil
end

local function getUsername(userId)
    if not userId then return nil end
    for _, p2 in ipairs(Players:GetPlayers()) do
        if p2.UserId == userId then return p2.Name end
    end
    local ok, result = pcall(function()
        return Players:GetNameFromUserIdAsync(userId)
    end)
    if ok and result then return result end
    return nil
end

local function getDisplayName(userId)
    if not userId then return nil end
    for _, p2 in ipairs(Players:GetPlayers()) do
        if p2.UserId == userId then return p2.DisplayName end
    end
    return getUsername(userId)
end

local function getGameName(placeId)
    local ok, info = pcall(function()
        return game:GetService("MarketplaceService"):GetProductInfo(placeId, Enum.InfoType.Asset)
    end)
    if ok and info and info.Name then return info.Name end
    return "Game " .. tostring(placeId)
end

local function httpGet(url)
    local ok, res = pcall(function() return game:HttpGet(url) end)
    if ok and type(res) == "string" and #res > 0 then return res end
    return nil
end

local function getServers(placeId, limit)
    limit = limit or 100
    local url = "https://games.roblox.com/v1/games/" .. tostring(placeId) ..
                "/servers/Public?sortOrder=Desc&excludeFullGames=false&limit=" ..
                tostring(limit)
    local data = httpGet(url)
    if not data then return {} end
    local servers = {}
    for block in data:gmatch("{[^}]+}") do
        local id      = block:match('"id"%s*:%s*"([^"]+)"')
        local playing = tonumber(block:match('"playing"%s*:%s*(%d+)')) or 0
        local maxP    = tonumber(block:match('"maxPlayers"%s*:%s*(%d+)')) or 0
        if id and id ~= "" then
            table.insert(servers, {id = id, playing = playing, maxPlayers = maxP})
        end
    end
    return servers
end

local function getPlayerPresence(userId)
    for _, p2 in ipairs(Players:GetPlayers()) do
        if p2.UserId == userId then
            return { placeId = game.PlaceId, jobId = game.JobId, inThisServer = true }
        end
    end
    return nil
end

local function joinByPlaceId(placeId)
    notify("Joining", "Teleporting to game " .. tostring(placeId) .. "...", 4)
    local ok, err = pcall(function() TeleportService:Teleport(placeId, plr) end)
    if not ok then notify("Error", tostring(err):sub(1, 60), 4) end
end

local function joinByJobId(placeId, jobId)
    notify("Joining", "Connecting to specific server...", 4)
    local ok, err = pcall(function()
        TeleportService:TeleportToPlaceInstance(placeId, jobId, plr)
    end)
    if not ok then notify("Error", tostring(err):sub(1, 60), 4) end
end

local function joinNewServer(placeId)
    placeId = placeId or game.PlaceId
    local servers = getServers(placeId, 100)
    local eligible = {}
    for _, sv in ipairs(servers) do
        if sv.id ~= game.JobId and sv.playing < sv.maxPlayers then
            table.insert(eligible, sv)
        end
    end
    if #eligible > 0 then
        local sv = eligible[math.random(1, #eligible)]
        joinByJobId(placeId, sv.id)
    else
        joinByPlaceId(placeId)
    end
end

-- ================================================================
--  GUI
-- ================================================================
local sg = Instance.new("ScreenGui")
sg.Name = "LillysSnipes"; sg.ResetOnSpawn = false; sg.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
local _ok2, _hh = pcall(function() return gethui() end)
pcall(function() sg.Parent = (_ok2 and _hh) or plr:WaitForChild("PlayerGui", 8) end)
if not sg.Parent then sg.Parent = plr.PlayerGui end

local win = Instance.new("Frame", sg)
win.Size = UDim2.new(0, 480, 0, 580); win.Position = UDim2.new(0.5, -240, 0.5, -290)
win.BackgroundColor3 = C.BG; win.BorderSizePixel = 0
win.Active = true; win.Draggable = true
Instance.new("UICorner", win).CornerRadius = UDim.new(0, 14)
local winStr = Instance.new("UIStroke", win); winStr.Color = C.ACC; winStr.Thickness = 1.8

local stripe = Instance.new("Frame", win)
stripe.Size = UDim2.new(1, 0, 0, 4); stripe.BackgroundColor3 = C.ACC; stripe.BorderSizePixel = 0
local strG = Instance.new("UIGradient", stripe)
strG.Color = ColorSequence.new({
    ColorSequenceKeypoint.new(0, Color3.fromRGB(55, 0, 165)),
    ColorSequenceKeypoint.new(0.5, Color3.fromRGB(195, 70, 255)),
    ColorSequenceKeypoint.new(1, Color3.fromRGB(55, 0, 165)),
})

local tBar = Instance.new("Frame", win)
tBar.Size = UDim2.new(1, 0, 0, 48); tBar.Position = UDim2.new(0, 0, 0, 4)
tBar.BackgroundColor3 = C.PANEL; tBar.BorderSizePixel = 0

local tTitle = Instance.new("TextLabel", tBar)
tTitle.Size = UDim2.new(1, -90, 0, 22); tTitle.Position = UDim2.new(0, 14, 0, 5)
tTitle.BackgroundTransparency = 1; tTitle.Font = Enum.Font.GothamBold
tTitle.TextSize = 17; tTitle.TextColor3 = C.TXT
tTitle.TextXAlignment = Enum.TextXAlignment.Left; tTitle.Text = "Lilly's Snipes"

local tSub = Instance.new("TextLabel", tBar)
tSub.Size = UDim2.new(1, -90, 0, 14); tSub.Position = UDim2.new(0, 14, 0, 29)
tSub.BackgroundTransparency = 1; tSub.Font = Enum.Font.Gotham
tSub.TextSize = 10; tSub.TextColor3 = C.TXTM
tSub.TextXAlignment = Enum.TextXAlignment.Left; tSub.Text = "discord.gg/7nNG53SHJY"

local minBtn = Instance.new("TextButton", tBar)
minBtn.Size = UDim2.new(0, 30, 0, 22); minBtn.Position = UDim2.new(1, -38, 0.5, -11)
minBtn.BackgroundColor3 = Color3.fromRGB(30, 16, 60); minBtn.BorderSizePixel = 0
minBtn.Font = Enum.Font.GothamBold; minBtn.TextSize = 14; minBtn.TextColor3 = C.TXT
minBtn.Text = "-"; minBtn.AutoButtonColor = false
Instance.new("UICorner", minBtn).CornerRadius = UDim.new(0, 6)
minBtn.MouseEnter:Connect(function()
    TweenService:Create(minBtn, TweenInfo.new(0.12), {BackgroundColor3 = C.ACC}):Play()
end)
minBtn.MouseLeave:Connect(function()
    TweenService:Create(minBtn, TweenInfo.new(0.12), {BackgroundColor3 = Color3.fromRGB(30, 16, 60)}):Play()
end)

local scroll = Instance.new("ScrollingFrame", win)
scroll.Size = UDim2.new(1, -8, 1, -60); scroll.Position = UDim2.new(0, 4, 0, 58)
scroll.BackgroundTransparency = 1; scroll.BorderSizePixel = 0
scroll.ScrollBarThickness = 4; scroll.ScrollBarImageColor3 = C.ACC
scroll.AutomaticCanvasSize = Enum.AutomaticSize.Y; scroll.CanvasSize = UDim2.new(0, 0, 0, 0)
local layout = Instance.new("UIListLayout", scroll)
layout.Padding = UDim.new(0, 6); layout.SortOrder = Enum.SortOrder.LayoutOrder
local sPad = Instance.new("UIPadding", scroll)
sPad.PaddingLeft = UDim.new(0, 8); sPad.PaddingRight = UDim.new(0, 8)
sPad.PaddingTop = UDim.new(0, 8); sPad.PaddingBottom = UDim.new(0, 8)

local minimised = false
minBtn.MouseButton1Click:Connect(function()
    minimised = not minimised
    TweenService:Create(win, TweenInfo.new(0.22, Enum.EasingStyle.Quart), {
        Size = minimised and UDim2.new(0, 480, 0, 56) or UDim2.new(0, 480, 0, 580)
    }):Play()
    scroll.Visible = not minimised
    minBtn.Text = minimised and "+" or "-"
end)

-- ================================================================
--  BUILDERS
-- ================================================================
local ord = 0
local function nxt() ord = ord + 1; return ord end

local function Sec(txt)
    local f = Instance.new("Frame", scroll)
    f.Size = UDim2.new(1, 0, 0, 24); f.BackgroundTransparency = 1; f.LayoutOrder = nxt()
    local l = Instance.new("TextLabel", f)
    l.Size = UDim2.new(1, 0, 1, 0); l.BackgroundTransparency = 1
    l.Text = "  " .. txt:upper(); l.Font = Enum.Font.GothamBold
    l.TextSize = 10; l.TextColor3 = C.ACC2; l.TextXAlignment = Enum.TextXAlignment.Left
    local ln = Instance.new("Frame", f)
    ln.Size = UDim2.new(1, -4, 0, 1); ln.Position = UDim2.new(0, 2, 1, -1)
    ln.BackgroundColor3 = C.ACC; ln.BorderSizePixel = 0; ln.BackgroundTransparency = 0.6
end

local function Act(label, col, fn)
    local b = Instance.new("TextButton", scroll)
    b.Size = UDim2.new(1, 0, 0, 34); b.BackgroundColor3 = col or C.ACC
    b.BorderSizePixel = 0; b.Font = Enum.Font.GothamSemibold; b.TextSize = 12
    b.TextColor3 = C.WHT; b.Text = label; b.LayoutOrder = nxt(); b.AutoButtonColor = false
    Instance.new("UICorner", b).CornerRadius = UDim.new(0, 8)
    local bc = col or C.ACC
    b.MouseEnter:Connect(function()
        TweenService:Create(b, TweenInfo.new(0.12), {BackgroundColor3 = Color3.new(
            math.min(bc.R+0.12,1), math.min(bc.G+0.12,1), math.min(bc.B+0.12,1))}):Play()
    end)
    b.MouseLeave:Connect(function()
        TweenService:Create(b, TweenInfo.new(0.12), {BackgroundColor3 = bc}):Play()
    end)
    b.MouseButton1Click:Connect(fn); return b
end

local function Info(txt)
    local f = Instance.new("Frame", scroll)
    f.Size = UDim2.new(1, 0, 0, 16); f.BackgroundTransparency = 1; f.LayoutOrder = nxt()
    local l = Instance.new("TextLabel", f)
    l.Size = UDim2.new(1, 0, 1, 0); l.BackgroundTransparency = 1
    l.Text = "  " .. txt; l.Font = Enum.Font.Gotham; l.TextSize = 10
    l.TextColor3 = C.TXTM; l.TextXAlignment = Enum.TextXAlignment.Left
end

local function InputRow(lbl, ph, btnTxt, btnCol, fn)
    local row = Instance.new("Frame", scroll)
    row.Size = UDim2.new(1, 0, 0, 38); row.BackgroundColor3 = C.PANEL
    row.BorderSizePixel = 0; row.LayoutOrder = nxt()
    Instance.new("UICorner", row).CornerRadius = UDim.new(0, 8)

    local lLabel = Instance.new("TextLabel", row)
    lLabel.Size = UDim2.new(0, 76, 1, 0); lLabel.Position = UDim2.new(0, 8, 0, 0)
    lLabel.BackgroundTransparency = 1; lLabel.Font = Enum.Font.Gotham; lLabel.TextSize = 11
    lLabel.TextColor3 = C.TXTM; lLabel.TextXAlignment = Enum.TextXAlignment.Left
    lLabel.Text = lbl

    local btnW = btnTxt and 72 or 0
    local box = Instance.new("TextBox", row)
    box.Size = UDim2.new(1, -88 - (btnTxt and (btnW + 6) or 0), 0, 26)
    box.Position = UDim2.new(0, 84, 0.5, -13)
    box.BackgroundColor3 = C.DARK; box.BorderSizePixel = 0
    box.Font = Enum.Font.GothamSemibold; box.TextSize = 12; box.TextColor3 = C.TXT
    box.PlaceholderText = ph; box.PlaceholderColor3 = C.TXTM
    box.Text = ""; box.ClearTextOnFocus = false
    Instance.new("UICorner", box).CornerRadius = UDim.new(0, 6)

    if btnTxt and fn then
        local btn = Instance.new("TextButton", row)
        btn.Size = UDim2.new(0, btnW, 0, 26); btn.Position = UDim2.new(1, -(btnW+6), 0.5, -13)
        btn.BackgroundColor3 = btnCol or C.ACC; btn.BorderSizePixel = 0
        btn.Font = Enum.Font.GothamBold; btn.TextSize = 11; btn.TextColor3 = C.WHT
        btn.Text = btnTxt; btn.AutoButtonColor = false
        Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 6)
        local bc = btnCol or C.ACC
        btn.MouseEnter:Connect(function()
            TweenService:Create(btn, TweenInfo.new(0.12), {BackgroundColor3 = Color3.new(
                math.min(bc.R+0.12,1), math.min(bc.G+0.12,1), math.min(bc.B+0.12,1))}):Play()
        end)
        btn.MouseLeave:Connect(function()
            TweenService:Create(btn, TweenInfo.new(0.12), {BackgroundColor3 = bc}):Play()
        end)
        btn.MouseButton1Click:Connect(function() fn(box.Text) end)
        box.FocusLost:Connect(function(enter) if enter then fn(box.Text) end end)
    end
    return box
end

local function ResultCard(h, defaultTxt)
    local f = Instance.new("Frame", scroll)
    f.Size = UDim2.new(1, 0, 0, h or 50); f.BackgroundColor3 = C.DARK
    f.BorderSizePixel = 0; f.LayoutOrder = nxt()
    Instance.new("UICorner", f).CornerRadius = UDim.new(0, 8)
    local fStr = Instance.new("UIStroke", f)
    fStr.Color = C.ACC; fStr.Thickness = 1; fStr.Transparency = 0.65
    local lbl = Instance.new("TextLabel", f)
    lbl.Size = UDim2.new(1, -14, 1, -4); lbl.Position = UDim2.new(0, 8, 0, 2)
    lbl.BackgroundTransparency = 1; lbl.Font = Enum.Font.Gotham; lbl.TextSize = 11
    lbl.TextColor3 = C.TXTM; lbl.TextWrapped = true; lbl.TextYAlignment = Enum.TextYAlignment.Top
    lbl.TextXAlignment = Enum.TextXAlignment.Left
    lbl.Text = defaultTxt or "Result will appear here"
    return f, lbl
end

-- ================================================================
--  SECTION 1 - JOIN BY PLACE ID
-- ================================================================
Sec("Join Game by Place ID")
Info("Paste any Roblox Place ID to teleport straight into that game")

local placeBox = InputRow("Place ID:", "e.g. 17017769", "Join", C.ACC, function(txt)
    local id = tonumber(txt:match("^%s*(%d+)%s*$"))
    if not id then notify("Error", "Enter a valid numeric Place ID", 3); return end
    task.spawn(function()
        local name = getGameName(id)
        notify("Joining", "Teleporting to: " .. name, 4)
        task.wait(0.5)
        joinByPlaceId(id)
    end)
end)

-- ================================================================
--  SECTION 2 - JOIN SPECIFIC SERVER (Place ID + Job ID)
-- ================================================================
Sec("Join Specific Server")
Info("Paste a Job ID (and optional Place ID) to land in one exact server")

local specPlaceBox = InputRow("Place ID:", "Place ID (blank = this game)", nil, nil, nil)
local specJobBox   = InputRow("Job ID:", "Paste Job ID here...", "Snipe", C.TEAL, function(txt)
    local jid = txt:match("^%s*(.-)%s*$")
    if jid == "" then notify("Error", "Paste a Job ID first", 3); return end
    local pid = tonumber((specPlaceBox.Text or ""):match("^%s*(%d+)%s*$")) or game.PlaceId
    task.spawn(function() joinByJobId(pid, jid) end)
end)

Act("📋  Copy MY Job ID  —  share this so friends can join you", Color3.fromRGB(35, 22, 72), function()
    pcall(function() setclipboard(game.JobId) end)
    notify("Copied!", "Your Job ID is now on your clipboard. Share it!", 4)
end)

Act("📋  Copy MY Place ID", Color3.fromRGB(35, 22, 72), function()
    pcall(function() setclipboard(tostring(game.PlaceId)) end)
    notify("Copied", "Place ID: " .. tostring(game.PlaceId), 4)
end)

-- ================================================================
--  SECTION 3 - PLAYERS IN THIS SERVER
-- ================================================================
Sec("Players In This Server")
Info("Everyone here right now — grab their Job ID to rejoin or share")

local lobbyContainer = Instance.new("Frame", scroll)
lobbyContainer.Size = UDim2.new(1, 0, 0, 200); lobbyContainer.BackgroundColor3 = C.DARK
lobbyContainer.BorderSizePixel = 0; lobbyContainer.LayoutOrder = nxt()
Instance.new("UICorner", lobbyContainer).CornerRadius = UDim.new(0, 9)
local lcStr = Instance.new("UIStroke", lobbyContainer)
lcStr.Color = C.ACC; lcStr.Thickness = 1; lcStr.Transparency = 0.55

local lobbyScroll = Instance.new("ScrollingFrame", lobbyContainer)
lobbyScroll.Size = UDim2.new(1, -6, 1, -6); lobbyScroll.Position = UDim2.new(0, 3, 0, 3)
lobbyScroll.BackgroundTransparency = 1; lobbyScroll.BorderSizePixel = 0
lobbyScroll.ScrollBarThickness = 3; lobbyScroll.ScrollBarImageColor3 = C.ACC
lobbyScroll.AutomaticCanvasSize = Enum.AutomaticSize.Y; lobbyScroll.CanvasSize = UDim2.new(0,0,0,0)
Instance.new("UICorner", lobbyScroll).CornerRadius = UDim.new(0, 7)
local llLayout = Instance.new("UIListLayout", lobbyScroll)
llLayout.Padding = UDim.new(0, 3); llLayout.SortOrder = Enum.SortOrder.LayoutOrder
local llPad = Instance.new("UIPadding", lobbyScroll)
llPad.PaddingLeft = UDim.new(0, 4); llPad.PaddingRight = UDim.new(0, 4)
llPad.PaddingTop = UDim.new(0, 4); llPad.PaddingBottom = UDim.new(0, 4)

local function buildLobbyList()
    for _, ch in ipairs(lobbyScroll:GetChildren()) do
        if ch:IsA("Frame") then ch:Destroy() end
    end
    for idx, p2 in ipairs(Players:GetPlayers()) do
        local isMe = p2 == plr

        local row = Instance.new("Frame", lobbyScroll)
        row.Size = UDim2.new(1, 0, 0, 54)
        row.BackgroundColor3 = isMe and Color3.fromRGB(12, 26, 12) or C.PANEL
        row.BorderSizePixel = 0; row.LayoutOrder = idx
        Instance.new("UICorner", row).CornerRadius = UDim.new(0, 6)
        if isMe then Instance.new("UIStroke", row).Color = C.ON end

        local nameLbl = Instance.new("TextLabel", row)
        nameLbl.Size = UDim2.new(1, -10, 0, 17); nameLbl.Position = UDim2.new(0, 8, 0, 4)
        nameLbl.BackgroundTransparency = 1; nameLbl.Font = Enum.Font.GothamBold; nameLbl.TextSize = 12
        nameLbl.TextColor3 = isMe and C.ON or C.TXT; nameLbl.TextXAlignment = Enum.TextXAlignment.Left
        nameLbl.Text = (isMe and "★ YOU  " or "") .. "@" .. p2.Name .. "  (" .. p2.DisplayName .. ")"

        local idLbl = Instance.new("TextLabel", row)
        idLbl.Size = UDim2.new(1, -10, 0, 12); idLbl.Position = UDim2.new(0, 8, 0, 22)
        idLbl.BackgroundTransparency = 1; idLbl.Font = Enum.Font.Gotham; idLbl.TextSize = 9
        idLbl.TextColor3 = C.TXTM; idLbl.TextXAlignment = Enum.TextXAlignment.Left
        idLbl.Text = "ID: " .. p2.UserId .. "   JID: " .. game.JobId:sub(1,20) .. "..."

        local capP   = p2
        local capJid = game.JobId
        local capPid = game.PlaceId

        local b1 = Instance.new("TextButton", row)
        b1.Size = UDim2.new(0, 60, 0, 19); b1.Position = UDim2.new(0, 6, 1, -23)
        b1.BackgroundColor3 = Color3.fromRGB(30, 18, 60); b1.BorderSizePixel = 0
        b1.Font = Enum.Font.GothamBold; b1.TextSize = 9; b1.TextColor3 = C.TXTM
        b1.Text = "Copy ID"; b1.AutoButtonColor = false
        Instance.new("UICorner", b1).CornerRadius = UDim.new(0, 4)
        b1.MouseButton1Click:Connect(function()
            pcall(function() setclipboard(tostring(capP.UserId)) end)
            local o = b1.Text; b1.Text = "✓ Done"
            TweenService:Create(b1, TweenInfo.new(0.1), {BackgroundColor3 = C.ACC}):Play()
            notify("Copied", "User ID: " .. tostring(capP.UserId), 3)
            task.delay(2, function()
                if b1 and b1.Parent then b1.Text = o
                    TweenService:Create(b1, TweenInfo.new(0.1), {BackgroundColor3 = Color3.fromRGB(30,18,60)}):Play() end
            end)
        end)

        local b2 = Instance.new("TextButton", row)
        b2.Size = UDim2.new(0, 72, 0, 19); b2.Position = UDim2.new(0, 70, 1, -23)
        b2.BackgroundColor3 = Color3.fromRGB(22, 14, 48); b2.BorderSizePixel = 0
        b2.Font = Enum.Font.GothamBold; b2.TextSize = 9; b2.TextColor3 = C.TXTM
        b2.Text = "Copy Name"; b2.AutoButtonColor = false
        Instance.new("UICorner", b2).CornerRadius = UDim.new(0, 4)
        b2.MouseButton1Click:Connect(function()
            pcall(function() setclipboard(capP.Name) end)
            local o = b2.Text; b2.Text = "✓ Done"
            TweenService:Create(b2, TweenInfo.new(0.1), {BackgroundColor3 = C.ACC}):Play()
            task.delay(2, function()
                if b2 and b2.Parent then b2.Text = o
                    TweenService:Create(b2, TweenInfo.new(0.1), {BackgroundColor3 = Color3.fromRGB(22,14,48)}):Play() end
            end)
        end)

        local b3 = Instance.new("TextButton", row)
        b3.Size = UDim2.new(0, 88, 0, 19); b3.Position = UDim2.new(0, 146, 1, -23)
        b3.BackgroundColor3 = Color3.fromRGB(12, 48, 52); b3.BorderSizePixel = 0
        b3.Font = Enum.Font.GothamBold; b3.TextSize = 9; b3.TextColor3 = C.TEAL
        b3.Text = "📋 Copy Job ID"; b3.AutoButtonColor = false
        Instance.new("UICorner", b3).CornerRadius = UDim.new(0, 4)
        b3.MouseButton1Click:Connect(function()
            pcall(function() setclipboard(capJid) end)
            specJobBox.Text = capJid
            local o = b3.Text; b3.Text = "✓ Copied!"
            TweenService:Create(b3, TweenInfo.new(0.1), {BackgroundColor3 = C.TEAL}):Play()
            notify("Job ID Copied!", "Paste it in 'Join Specific Server' so anyone can join this server!", 5)
            task.delay(2.5, function()
                if b3 and b3.Parent then b3.Text = o
                    TweenService:Create(b3, TweenInfo.new(0.1), {BackgroundColor3 = Color3.fromRGB(12,48,52)}):Play() end
            end)
        end)

        if not isMe then
            local b4 = Instance.new("TextButton", row)
            b4.Size = UDim2.new(0, 50, 0, 19); b4.Position = UDim2.new(1, -56, 1, -23)
            b4.BackgroundColor3 = Color3.fromRGB(16, 50, 16); b4.BorderSizePixel = 0
            b4.Font = Enum.Font.GothamBold; b4.TextSize = 9; b4.TextColor3 = C.ON
            b4.Text = "⚡ Join"; b4.AutoButtonColor = false
            Instance.new("UICorner", b4).CornerRadius = UDim.new(0, 4)
            b4.MouseButton1Click:Connect(function()
                b4.Text = "..."
                task.spawn(function() joinByJobId(capPid, capJid) end)
            end)
        end
    end
end

buildLobbyList()
Players.PlayerAdded:Connect(function() task.delay(0.5, buildLobbyList) end)
Players.PlayerRemoving:Connect(function() task.delay(0.1, buildLobbyList) end)

-- ================================================================
--  SECTION 4 - PLAYER SEARCH
-- ================================================================
Sec("Player Search")
Info("Search any username — if they're here you'll get their Job ID to copy or join")

local lastFoundPlaceId = nil
local lastFoundJobId   = nil
local lastFoundName    = nil

local playerResult, playerResultLbl = ResultCard(112, "Search a username above to see their info")

local jobBar = Instance.new("Frame", scroll)
jobBar.Size = UDim2.new(1, 0, 0, 36)
jobBar.BackgroundColor3 = Color3.fromRGB(10, 30, 12)
jobBar.BorderSizePixel = 0; jobBar.LayoutOrder = nxt(); jobBar.Visible = false
Instance.new("UICorner", jobBar).CornerRadius = UDim.new(0, 8)
local jbStr = Instance.new("UIStroke", jobBar)
jbStr.Color = C.ON; jbStr.Thickness = 1; jbStr.Transparency = 0.45

local jbLabel = Instance.new("TextLabel", jobBar)
jbLabel.Size = UDim2.new(0, 110, 1, 0); jbLabel.Position = UDim2.new(0, 10, 0, 0)
jbLabel.BackgroundTransparency = 1; jbLabel.Font = Enum.Font.GothamBold; jbLabel.TextSize = 11
jbLabel.TextColor3 = C.ON; jbLabel.TextXAlignment = Enum.TextXAlignment.Left
jbLabel.Text = "✅  Found here:"

local jbCopyBtn = Instance.new("TextButton", jobBar)
jbCopyBtn.Size = UDim2.new(0, 128, 0, 24); jbCopyBtn.Position = UDim2.new(0, 118, 0.5, -12)
jbCopyBtn.BackgroundColor3 = Color3.fromRGB(12, 48, 52); jbCopyBtn.BorderSizePixel = 0
jbCopyBtn.Font = Enum.Font.GothamBold; jbCopyBtn.TextSize = 11; jbCopyBtn.TextColor3 = C.TEAL
jbCopyBtn.Text = "📋  Copy Job ID"; jbCopyBtn.AutoButtonColor = false
Instance.new("UICorner", jbCopyBtn).CornerRadius = UDim.new(0, 6)
jbCopyBtn.MouseEnter:Connect(function()
    TweenService:Create(jbCopyBtn, TweenInfo.new(0.12), {BackgroundColor3 = Color3.fromRGB(16, 72, 78)}):Play()
end)
jbCopyBtn.MouseLeave:Connect(function()
    TweenService:Create(jbCopyBtn, TweenInfo.new(0.12), {BackgroundColor3 = Color3.fromRGB(12, 48, 52)}):Play()
end)
jbCopyBtn.MouseButton1Click:Connect(function()
    if not lastFoundJobId then return end
    pcall(function() setclipboard(lastFoundJobId) end)
    specJobBox.Text = lastFoundJobId
    local o = jbCopyBtn.Text; jbCopyBtn.Text = "✓ Copied!"
    TweenService:Create(jbCopyBtn, TweenInfo.new(0.15), {BackgroundColor3 = C.TEAL}):Play()
    notify("Job ID Copied!", "@" .. (lastFoundName or "?") .. "'s server Job ID is on your clipboard!", 5)
    task.delay(2.5, function()
        if jbCopyBtn and jbCopyBtn.Parent then jbCopyBtn.Text = o
            TweenService:Create(jbCopyBtn, TweenInfo.new(0.15), {BackgroundColor3 = Color3.fromRGB(12,48,52)}):Play() end
    end)
end)

local jbJoinBtn = Instance.new("TextButton", jobBar)
jbJoinBtn.Size = UDim2.new(0, 136, 0, 24); jbJoinBtn.Position = UDim2.new(1, -142, 0.5, -12)
jbJoinBtn.BackgroundColor3 = Color3.fromRGB(14, 48, 14); jbJoinBtn.BorderSizePixel = 0
jbJoinBtn.Font = Enum.Font.GothamBold; jbJoinBtn.TextSize = 11; jbJoinBtn.TextColor3 = C.ON
jbJoinBtn.Text = "⚡  Join Their Server"; jbJoinBtn.AutoButtonColor = false
Instance.new("UICorner", jbJoinBtn).CornerRadius = UDim.new(0, 6)
jbJoinBtn.MouseEnter:Connect(function()
    TweenService:Create(jbJoinBtn, TweenInfo.new(0.12), {BackgroundColor3 = Color3.fromRGB(20, 72, 20)}):Play()
end)
jbJoinBtn.MouseLeave:Connect(function()
    TweenService:Create(jbJoinBtn, TweenInfo.new(0.12), {BackgroundColor3 = Color3.fromRGB(14, 48, 14)}):Play()
end)
jbJoinBtn.MouseButton1Click:Connect(function()
    if not lastFoundJobId or not lastFoundPlaceId then
        notify("Error", "No Job ID — search a player in this server first", 4); return
    end
    jbJoinBtn.Text = "Joining..."
    task.spawn(function() joinByJobId(lastFoundPlaceId, lastFoundJobId) end)
    task.delay(4, function()
        if jbJoinBtn and jbJoinBtn.Parent then jbJoinBtn.Text = "⚡  Join Their Server" end
    end)
end)

local playerBox = InputRow("Username:", "Username or Display Name...", "Search", C.GOLD, function(txt)
    local name = txt:match("^%s*(.-)%s*$")
    if name == "" then notify("Search", "Enter a username", 3); return end
    playerResultLbl.Text = "🔍  Searching for '" .. name .. "'..."
    playerResultLbl.TextColor3 = C.TXTM
    jobBar.Visible = false

    task.spawn(function()
        local userId = getUserId(name)
        if not userId then
            local lobbyNames = {}
            for _, p2 in ipairs(Players:GetPlayers()) do table.insert(lobbyNames, "@" .. p2.Name) end
            playerResultLbl.Text =
                "❌  Not found: '" .. name .. "'\n" ..
                "Use their exact Roblox Username, not Display Name.\n" ..
                "Players here: " .. (#lobbyNames > 0 and table.concat(lobbyNames, ", ") or "none")
            playerResultLbl.TextColor3 = C.OFF
            notify("Not Found", "Try their exact Roblox username", 4)
            return
        end

        local confirmedName = getUsername(userId) or name
        local displayName   = getDisplayName(userId) or confirmedName
        local presInfo      = getPlayerPresence(userId)
        lastFoundName       = confirmedName

        if presInfo and presInfo.inThisServer then
            lastFoundPlaceId = game.PlaceId
            lastFoundJobId   = game.JobId

            specJobBox.Text = game.JobId

            playerResultLbl.Text =
                "✅  @" .. confirmedName .. "  (" .. displayName .. ")\n" ..
                "User ID:  " .. tostring(userId) .. "\n" ..
                "Status:   IN THIS SERVER  ↓  Job ID ready below\n" ..
                "Job ID:   " .. game.JobId
            playerResultLbl.TextColor3 = C.ON

            jobBar.Visible = true
            jbLabel.Text   = "✅  " .. confirmedName .. " is here:"
            jbCopyBtn.Text = "📋  Copy Job ID"
            jbJoinBtn.Text = "⚡  Join Their Server"

            pcall(function() setclipboard(game.JobId) end)
            notify("Found!", "@" .. confirmedName .. " is HERE — Job ID auto-copied to clipboard!", 5)
        else
            lastFoundPlaceId = nil
            lastFoundJobId   = nil

            playerResultLbl.Text =
                "👤  @" .. confirmedName .. "  (" .. displayName .. ")\n" ..
                "User ID:  " .. tostring(userId) .. "\n" ..
                "Status:   Not in this server.\n" ..
                "Tip:      Ask them for their Job ID, then paste it in 'Join Specific Server'."
            playerResultLbl.TextColor3 = C.TXT
            jobBar.Visible = false
            pcall(function() setclipboard(tostring(userId)) end)
            notify("Found", "@" .. confirmedName .. " | User ID copied: " .. tostring(userId), 4)
        end
    end)
end)

-- ================================================================
--  SECTION 5 - USER ID LOOKUP
-- ================================================================
Sec("User ID Lookup")
Info("Convert username to User ID, or User ID to username")

local utoiResult, utoiResultLbl = ResultCard(36, "Result will show here")
local utoiBox = InputRow("Username:", "Exact Roblox username...", "Get ID", C.GOLD, function(txt)
    local name = txt:match("^%s*(.-)%s*$")
    if name == "" then return end
    utoiResultLbl.Text = "Looking up '" .. name .. "'..."; utoiResultLbl.TextColor3 = C.TXTM
    task.spawn(function()
        local id = getUserId(name)
        if id then
            local confirmed = getUsername(id) or name
            utoiResultLbl.Text = "@" .. confirmed .. "  ->  User ID: " .. tostring(id)
            utoiResultLbl.TextColor3 = C.TXT
            pcall(function() setclipboard(tostring(id)) end)
            notify("ID Found", "@" .. confirmed .. " = " .. tostring(id) .. " (copied!)", 4)
        else
            utoiResultLbl.Text = "Not found: '" .. name .. "'  (use exact Roblox username)"
            utoiResultLbl.TextColor3 = C.OFF
            notify("Not Found", "Use their exact Roblox username, not display name", 4)
        end
    end)
end)

local itonResult, itonResultLbl = ResultCard(36, "Result will show here")
local itonBox = InputRow("User ID:", "Numeric User ID...", "Get Name", C.GOLD, function(txt)
    local id = tonumber(txt:match("^%s*(%d+)%s*$"))
    if not id then notify("Error", "Enter a valid number", 3); return end
    itonResultLbl.Text = "Looking up ID " .. id .. "..."; itonResultLbl.TextColor3 = C.TXTM
    task.spawn(function()
        local name = getUsername(id)
        if name then
            itonResultLbl.Text = "ID " .. id .. "  ->  @" .. name
            itonResultLbl.TextColor3 = C.TXT
            pcall(function() setclipboard(name) end)
            notify("Found", "@" .. name .. " (username copied!)", 4)
        else
            itonResultLbl.Text = "No account found for ID: " .. tostring(id)
            itonResultLbl.TextColor3 = C.OFF
        end
    end)
end)

-- ================================================================
--  SECTION 6 - SERVER BROWSER
-- ================================================================
Sec("Server Browser")
Info("Browse active servers — copy any Job ID or jump straight in")

local browserPlaceBox = InputRow("Place ID:", "Blank = current game", nil, nil, nil)

local browserContainer = Instance.new("Frame", scroll)
browserContainer.Size = UDim2.new(1, 0, 0, 300); browserContainer.BackgroundColor3 = C.DARK
browserContainer.BorderSizePixel = 0; browserContainer.LayoutOrder = nxt()
Instance.new("UICorner", browserContainer).CornerRadius = UDim.new(0, 10)
local bcStr = Instance.new("UIStroke", browserContainer)
bcStr.Color = C.ACC; bcStr.Thickness = 1; bcStr.Transparency = 0.55

local bcHeader = Instance.new("Frame", browserContainer)
bcHeader.Size = UDim2.new(1, 0, 0, 38); bcHeader.BackgroundColor3 = C.PANEL; bcHeader.BorderSizePixel = 0
Instance.new("UICorner", bcHeader).CornerRadius = UDim.new(0, 10)

local bcStatusLbl = Instance.new("TextLabel", bcHeader)
bcStatusLbl.Size = UDim2.new(1, -120, 1, 0); bcStatusLbl.Position = UDim2.new(0, 10, 0, 0)
bcStatusLbl.BackgroundTransparency = 1; bcStatusLbl.Font = Enum.Font.GothamSemibold
bcStatusLbl.TextSize = 11; bcStatusLbl.TextColor3 = C.TXTM
bcStatusLbl.TextXAlignment = Enum.TextXAlignment.Left; bcStatusLbl.Text = "Press Load to browse servers"

local bcLoadBtn = Instance.new("TextButton", bcHeader)
bcLoadBtn.Size = UDim2.new(0, 108, 0, 26); bcLoadBtn.Position = UDim2.new(1, -114, 0.5, -13)
bcLoadBtn.BackgroundColor3 = C.ACC; bcLoadBtn.BorderSizePixel = 0
bcLoadBtn.Font = Enum.Font.GothamBold; bcLoadBtn.TextSize = 11; bcLoadBtn.TextColor3 = C.WHT
bcLoadBtn.Text = "Load Servers"; bcLoadBtn.AutoButtonColor = false
Instance.new("UICorner", bcLoadBtn).CornerRadius = UDim.new(0, 6)
bcLoadBtn.MouseEnter:Connect(function()
    TweenService:Create(bcLoadBtn, TweenInfo.new(0.12), {BackgroundColor3 = C.ACC2}):Play()
end)
bcLoadBtn.MouseLeave:Connect(function()
    TweenService:Create(bcLoadBtn, TweenInfo.new(0.12), {BackgroundColor3 = C.ACC}):Play()
end)

local serverListScroll = Instance.new("ScrollingFrame", browserContainer)
serverListScroll.Size = UDim2.new(1, -6, 1, -44); serverListScroll.Position = UDim2.new(0, 3, 0, 41)
serverListScroll.BackgroundColor3 = Color3.fromRGB(10, 6, 20); serverListScroll.BorderSizePixel = 0
serverListScroll.ScrollBarThickness = 3; serverListScroll.ScrollBarImageColor3 = C.ACC
serverListScroll.AutomaticCanvasSize = Enum.AutomaticSize.Y; serverListScroll.CanvasSize = UDim2.new(0,0,0,0)
Instance.new("UICorner", serverListScroll).CornerRadius = UDim.new(0, 7)
local slLayout = Instance.new("UIListLayout", serverListScroll)
slLayout.Padding = UDim.new(0, 4); slLayout.SortOrder = Enum.SortOrder.LayoutOrder
local slPad = Instance.new("UIPadding", serverListScroll)
slPad.PaddingLeft = UDim.new(0, 4); slPad.PaddingRight = UDim.new(0, 4)
slPad.PaddingTop = UDim.new(0, 4); slPad.PaddingBottom = UDim.new(0, 4)

local function buildServerRows(placeId, servers)
    for _, ch in ipairs(serverListScroll:GetChildren()) do
        if ch:IsA("Frame") then ch:Destroy() end
    end
    if #servers == 0 then
        local noLbl = Instance.new("TextLabel", serverListScroll)
        noLbl.Size = UDim2.new(1, 0, 0, 30); noLbl.BackgroundTransparency = 1
        noLbl.Font = Enum.Font.Gotham; noLbl.TextSize = 12; noLbl.LayoutOrder = 1
        noLbl.TextColor3 = C.TXTM; noLbl.TextXAlignment = Enum.TextXAlignment.Center
        noLbl.Text = "No servers found for this game"
        return
    end
    table.sort(servers, function(a, b) return (a.playing or 0) < (b.playing or 0) end)

    for idx, sv in ipairs(servers) do
        local fillPct = (sv.maxPlayers and sv.maxPlayers > 0)
            and math.floor((sv.playing / sv.maxPlayers) * 100) or 0
        local isCurrent = sv.id == game.JobId

        local row = Instance.new("Frame", serverListScroll)
        row.Size = UDim2.new(1, 0, 0, 50); row.LayoutOrder = idx
        row.BackgroundColor3 = isCurrent and Color3.fromRGB(14, 28, 12) or C.PANEL
        row.BorderSizePixel = 0
        Instance.new("UICorner", row).CornerRadius = UDim.new(0, 7)
        if isCurrent then
            local rs = Instance.new("UIStroke", row)
            rs.Color = C.ON; rs.Thickness = 1; rs.Transparency = 0.4
        end

        local topLbl = Instance.new("TextLabel", row)
        topLbl.Size = UDim2.new(1, -170, 0, 18); topLbl.Position = UDim2.new(0, 10, 0, 5)
        topLbl.BackgroundTransparency = 1; topLbl.Font = Enum.Font.GothamSemibold; topLbl.TextSize = 12
        topLbl.TextColor3 = isCurrent and C.ON or C.TXT; topLbl.TextXAlignment = Enum.TextXAlignment.Left
        topLbl.Text = (isCurrent and "★ YOU  " or "") .. sv.playing .. "/" .. (sv.maxPlayers or "?") .. " players  (" .. fillPct .. "%)"

        local idLbl = Instance.new("TextLabel", row)
        idLbl.Size = UDim2.new(1, -170, 0, 13); idLbl.Position = UDim2.new(0, 10, 0, 26)
        idLbl.BackgroundTransparency = 1; idLbl.Font = Enum.Font.Gotham; idLbl.TextSize = 9
        idLbl.TextColor3 = C.TXTM; idLbl.TextXAlignment = Enum.TextXAlignment.Left
        idLbl.Text = "JID: " .. sv.id:sub(1, 24) .. "..."
        idLbl.TextTruncate = Enum.TextTruncate.AtEnd

        local barTrack = Instance.new("Frame", row)
        barTrack.Size = UDim2.new(0, 5, 0.7, 0); barTrack.Position = UDim2.new(1, -14, 0.15, 0)
        barTrack.BackgroundColor3 = Color3.fromRGB(28, 16, 50); barTrack.BorderSizePixel = 0
        Instance.new("UICorner", barTrack).CornerRadius = UDim.new(1, 0)
        local barFill = Instance.new("Frame", barTrack)
        barFill.Size = UDim2.new(1, 0, fillPct / 100, 0)
        barFill.Position = UDim2.new(0, 0, 1 - fillPct / 100, 0)
        barFill.BackgroundColor3 = fillPct >= 85 and C.OFF or (fillPct >= 50 and C.GOLD or C.ON)
        barFill.BorderSizePixel = 0
        Instance.new("UICorner", barFill).CornerRadius = UDim.new(1, 0)

        local capSv = sv; local capPid = placeId

        local cjBtn = Instance.new("TextButton", row)
        cjBtn.Size = UDim2.new(0, 74, 0, 22); cjBtn.Position = UDim2.new(1, -156, 0.5, -11)
        cjBtn.BackgroundColor3 = Color3.fromRGB(12, 48, 52); cjBtn.BorderSizePixel = 0
        cjBtn.Font = Enum.Font.GothamBold; cjBtn.TextSize = 10; cjBtn.TextColor3 = C.TEAL
        cjBtn.Text = "📋 Copy JID"; cjBtn.AutoButtonColor = false
        Instance.new("UICorner", cjBtn).CornerRadius = UDim.new(0, 5)
        cjBtn.MouseEnter:Connect(function()
            TweenService:Create(cjBtn, TweenInfo.new(0.12), {BackgroundColor3 = Color3.fromRGB(16, 68, 74)}):Play()
        end)
        cjBtn.MouseLeave:Connect(function()
            TweenService:Create(cjBtn, TweenInfo.new(0.12), {BackgroundColor3 = Color3.fromRGB(12, 48, 52)}):Play()
        end)
        cjBtn.MouseButton1Click:Connect(function()
            pcall(function() setclipboard(capSv.id) end)
            specJobBox.Text = capSv.id
            lastFoundPlaceId = capPid
            local o = cjBtn.Text; cjBtn.Text = "✓ Copied!"
            TweenService:Create(cjBtn, TweenInfo.new(0.1), {BackgroundColor3 = C.TEAL}):Play()
            notify("Job ID Copied", "Also filled into 'Join Specific Server' box for you!", 4)
            task.delay(2.5, function()
                if cjBtn and cjBtn.Parent then cjBtn.Text = o
                    TweenService:Create(cjBtn, TweenInfo.new(0.1), {BackgroundColor3 = Color3.fromRGB(12,48,52)}):Play() end
            end)
        end)

        local joinBtn = Instance.new("TextButton", row)
        joinBtn.Size = UDim2.new(0, 68, 0, 22); joinBtn.Position = UDim2.new(1, -80, 0.5, -11)
        joinBtn.BackgroundColor3 = isCurrent and C.GRN or C.ACC
        joinBtn.BorderSizePixel = 0; joinBtn.Font = Enum.Font.GothamBold
        joinBtn.TextSize = 11; joinBtn.TextColor3 = C.WHT
        joinBtn.Text = isCurrent and "YOU'RE HERE" or "⚡ Join"; joinBtn.AutoButtonColor = false
        Instance.new("UICorner", joinBtn).CornerRadius = UDim.new(0, 6)
        joinBtn.MouseButton1Click:Connect(function()
            if capSv.id == game.JobId then notify("Info", "You are already in this server!", 3); return end
            joinBtn.Text = "..."
            task.spawn(function() joinByJobId(capPid, capSv.id) end)
        end)
    end
end

bcLoadBtn.MouseButton1Click:Connect(function()
    local pid = tonumber((browserPlaceBox.Text or ""):match("^%s*(%d+)%s*$")) or game.PlaceId
    bcStatusLbl.Text = "Loading servers for " .. pid .. "..."
    bcLoadBtn.Text = "Loading..."
    bcLoadBtn.BackgroundColor3 = Color3.fromRGB(50, 50, 80)
    task.spawn(function()
        local servers = getServers(pid, 100)
        bcStatusLbl.Text = #servers .. " servers for " .. pid
        bcLoadBtn.Text = "Refresh"
        bcLoadBtn.BackgroundColor3 = C.ACC
        buildServerRows(pid, servers)
        if #servers > 0 then
            notify("Browser", "Loaded " .. #servers .. " servers!", 3)
        else
            notify("Browser", "No servers found for " .. pid, 3)
        end
    end)
end)

-- ================================================================
--  SECTION 7 - PLAYER WATCH LIST
-- ================================================================

local function fetchPresence(userId)
    local url = "https://presence.roblox.com/v1/presence/users"
    local body = '{"userIds":[' .. tostring(userId) .. ']}'
    local ok, res = pcall(function()
        return game:HttpPost(url, body, "application/json")
    end)
    if not ok or not res then return "unknown" end
    local presType = tonumber(res:match('"userPresenceType"%s*:%s*(%d+)'))
    local lastLoc  = res:match('"lastLocation"%s*:%s*"([^"]*)"') or ""
    local placeId  = res:match('"placeId"%s*:%s*(%d+)')
    local gameId   = res:match('"gameId"%s*:%s*"([^"]*)"') or ""
    if presType == 2 or presType == 3 then
        return "in_game", tonumber(placeId), gameId, lastLoc
    elseif presType == 1 then
        return "online", nil, nil, "On Roblox website"
    else
        return "offline", nil, nil, ""
    end
end

local WATCH_FILE = "lillys_snipes_watchlist.txt"
local watchList = {}

local function saveWatchList()
    pcall(function()
        if not writefile then return end
        local parts = {}
        for _, w in ipairs(watchList) do
            table.insert(parts, tostring(w.userId) .. ":" .. w.username)
        end
        writefile(WATCH_FILE, table.concat(parts, "\n"))
    end)
end

local function loadWatchList()
    pcall(function()
        if not isfile or not readfile then return end
        if not isfile(WATCH_FILE) then return end
        local data = readfile(WATCH_FILE)
        for line in data:gmatch("[^\n]+") do
            local uid, uname = line:match("^(%d+):(.+)$")
            uid = tonumber(uid)
            if uid and uname and uname ~= "" then
                table.insert(watchList, {userId = uid, username = uname, displayName = uname})
            end
        end
    end)
end

loadWatchList()

task.spawn(function()
    for _, w in ipairs(watchList) do
        local dn = getDisplayName(w.userId)
        if dn then w.displayName = dn end
    end
end)

Sec("Player Watch List")
Info("Add players to track — shows Online / In-Game / Offline. Updates every 12 seconds.")

local addWatchRow = Instance.new("Frame", scroll)
addWatchRow.Size = UDim2.new(1, 0, 0, 38); addWatchRow.BackgroundColor3 = C.PANEL
addWatchRow.BorderSizePixel = 0; addWatchRow.LayoutOrder = nxt()
Instance.new("UICorner", addWatchRow).CornerRadius = UDim.new(0, 8)

local awLbl = Instance.new("TextLabel", addWatchRow)
awLbl.Size = UDim2.new(0, 76, 1, 0); awLbl.Position = UDim2.new(0, 8, 0, 0)
awLbl.BackgroundTransparency = 1; awLbl.Font = Enum.Font.Gotham; awLbl.TextSize = 11
awLbl.TextColor3 = C.TXTM; awLbl.TextXAlignment = Enum.TextXAlignment.Left
awLbl.Text = "Add Player:"

local awBox = Instance.new("TextBox", addWatchRow)
awBox.Size = UDim2.new(1, -162, 0, 26); awBox.Position = UDim2.new(0, 84, 0.5, -13)
awBox.BackgroundColor3 = C.DARK; awBox.BorderSizePixel = 0
awBox.Font = Enum.Font.GothamSemibold; awBox.TextSize = 12; awBox.TextColor3 = C.TXT
awBox.PlaceholderText = "Enter username to track..."; awBox.PlaceholderColor3 = C.TXTM
awBox.Text = ""; awBox.ClearTextOnFocus = false
Instance.new("UICorner", awBox).CornerRadius = UDim.new(0, 6)

local awAddBtn = Instance.new("TextButton", addWatchRow)
awAddBtn.Size = UDim2.new(0, 72, 0, 26); awAddBtn.Position = UDim2.new(1, -78, 0.5, -13)
awAddBtn.BackgroundColor3 = C.ON; awAddBtn.BorderSizePixel = 0
awAddBtn.Font = Enum.Font.GothamBold; awAddBtn.TextSize = 11; awAddBtn.TextColor3 = Color3.new(0,0,0)
awAddBtn.Text = "+ Add"; awAddBtn.AutoButtonColor = false
Instance.new("UICorner", awAddBtn).CornerRadius = UDim.new(0, 6)
awAddBtn.MouseEnter:Connect(function()
    TweenService:Create(awAddBtn, TweenInfo.new(0.12), {BackgroundColor3 = Color3.fromRGB(60, 230, 100)}):Play()
end)
awAddBtn.MouseLeave:Connect(function()
    TweenService:Create(awAddBtn, TweenInfo.new(0.12), {BackgroundColor3 = C.ON}):Play()
end)

local watchContainer = Instance.new("Frame", scroll)
watchContainer.Size = UDim2.new(1, 0, 0, 30)
watchContainer.BackgroundColor3 = C.DARK
watchContainer.BorderSizePixel = 0; watchContainer.LayoutOrder = nxt()
Instance.new("UICorner", watchContainer).CornerRadius = UDim.new(0, 9)
Instance.new("UIStroke", watchContainer).Color = C.ACC

local watchInner = Instance.new("ScrollingFrame", watchContainer)
watchInner.Size = UDim2.new(1, -6, 1, -6); watchInner.Position = UDim2.new(0, 3, 0, 3)
watchInner.BackgroundTransparency = 1; watchInner.BorderSizePixel = 0
watchInner.ScrollBarThickness = 3; watchInner.ScrollBarImageColor3 = C.ACC
watchInner.AutomaticCanvasSize = Enum.AutomaticSize.Y; watchInner.CanvasSize = UDim2.new(0,0,0,0)
Instance.new("UICorner", watchInner).CornerRadius = UDim.new(0, 7)
local wiLayout = Instance.new("UIListLayout", watchInner)
wiLayout.Padding = UDim.new(0, 3); wiLayout.SortOrder = Enum.SortOrder.LayoutOrder
local wiPad = Instance.new("UIPadding", watchInner)
wiPad.PaddingLeft = UDim.new(0, 4); wiPad.PaddingRight = UDim.new(0, 4)
wiPad.PaddingTop = UDim.new(0, 4); wiPad.PaddingBottom = UDim.new(0, 4)

local emptyLbl = Instance.new("TextLabel", watchInner)
emptyLbl.Size = UDim2.new(1, 0, 0, 28); emptyLbl.BackgroundTransparency = 1; emptyLbl.LayoutOrder = 999
emptyLbl.Font = Enum.Font.Gotham; emptyLbl.TextSize = 11; emptyLbl.TextColor3 = C.TXTM
emptyLbl.TextXAlignment = Enum.TextXAlignment.Center
emptyLbl.Text = "No players added yet. Type a username above and press + Add."

local STATUS_COLORS = {
    in_game = Color3.fromRGB(35, 195, 80),
    online  = Color3.fromRGB(80, 160, 255),
    offline = Color3.fromRGB(90, 70, 120),
    unknown = Color3.fromRGB(90, 70, 120),
}
local STATUS_LABELS = {
    in_game = "In Game",
    online  = "Online",
    offline = "Offline",
    unknown = "...",
}
local STATUS_ICONS = {
    in_game = "🎮",
    online  = "🌐",
    offline = "💤",
    unknown = "⋯",
}

local watchRows   = {}

local function updateWatchContainerHeight()
    local count = #watchList
    if count == 0 then
        watchContainer.Size = UDim2.new(1, 0, 0, 46)
    else
        watchContainer.Size = UDim2.new(1, 0, 0, math.min(count * 72 + 14, 300))
    end
    emptyLbl.Visible = count == 0
end

local function buildWatchRow(w)
    if watchRows[w.userId] then
        pcall(function() watchRows[w.userId].row:Destroy() end)
        watchRows[w.userId] = nil
    end

    local row = Instance.new("Frame", watchInner)
    row.Size = UDim2.new(1, 0, 0, 68); row.BackgroundColor3 = C.PANEL
    row.BorderSizePixel = 0; row.LayoutOrder = w.userId
    Instance.new("UICorner", row).CornerRadius = UDim.new(0, 7)

    local dot = Instance.new("Frame", row)
    dot.Size = UDim2.new(0, 10, 0, 10); dot.Position = UDim2.new(0, 10, 0.5, -5)
    dot.BackgroundColor3 = STATUS_COLORS.unknown; dot.BorderSizePixel = 0
    Instance.new("UICorner", dot).CornerRadius = UDim.new(1, 0)

    local nameLbl = Instance.new("TextLabel", row)
    nameLbl.Size = UDim2.new(1, -200, 0, 17); nameLbl.Position = UDim2.new(0, 28, 0, 5)
    nameLbl.BackgroundTransparency = 1; nameLbl.Font = Enum.Font.GothamBold; nameLbl.TextSize = 12
    nameLbl.TextColor3 = C.TXT; nameLbl.TextXAlignment = Enum.TextXAlignment.Left
    nameLbl.Text = "@" .. w.username
    if w.displayName and w.displayName ~= w.username then
        nameLbl.Text = "@" .. w.username .. "  (" .. w.displayName .. ")"
    end

    local statusLbl = Instance.new("TextLabel", row)
    statusLbl.Size = UDim2.new(1, -200, 0, 14); statusLbl.Position = UDim2.new(0, 28, 0, 23)
    statusLbl.BackgroundTransparency = 1; statusLbl.Font = Enum.Font.GothamBold; statusLbl.TextSize = 10
    statusLbl.TextColor3 = STATUS_COLORS.unknown; statusLbl.TextXAlignment = Enum.TextXAlignment.Left
    statusLbl.Text = "⋯  Checking..."

    local locationLbl = Instance.new("TextLabel", row)
    locationLbl.Size = UDim2.new(1, -200, 0, 12); locationLbl.Position = UDim2.new(0, 28, 0, 38)
    locationLbl.BackgroundTransparency = 1; locationLbl.Font = Enum.Font.Gotham; locationLbl.TextSize = 9
    locationLbl.TextColor3 = C.TXTM; locationLbl.TextXAlignment = Enum.TextXAlignment.Left
    locationLbl.Text = ""

    local cIdBtn = Instance.new("TextButton", row)
    cIdBtn.Size = UDim2.new(0, 58, 0, 20); cIdBtn.Position = UDim2.new(1, -196, 0, 6)
    cIdBtn.BackgroundColor3 = Color3.fromRGB(28, 16, 55); cIdBtn.BorderSizePixel = 0
    cIdBtn.Font = Enum.Font.GothamBold; cIdBtn.TextSize = 9; cIdBtn.TextColor3 = C.TXTM
    cIdBtn.Text = "Copy ID"; cIdBtn.AutoButtonColor = false
    Instance.new("UICorner", cIdBtn).CornerRadius = UDim.new(0, 5)
    cIdBtn.MouseButton1Click:Connect(function()
        pcall(function() setclipboard(tostring(w.userId)) end)
        local o = cIdBtn.Text; cIdBtn.Text = "✓ Done"
        TweenService:Create(cIdBtn, TweenInfo.new(0.1), {BackgroundColor3 = C.ACC}):Play()
        notify("Copied", "@" .. w.username .. " User ID: " .. w.userId, 3)
        task.delay(2, function()
            if cIdBtn and cIdBtn.Parent then cIdBtn.Text = o
                TweenService:Create(cIdBtn, TweenInfo.new(0.1), {BackgroundColor3 = Color3.fromRGB(28,16,55)}):Play() end
        end)
    end)

    local refBtn = Instance.new("TextButton", row)
    refBtn.Size = UDim2.new(0, 24, 0, 20); refBtn.Position = UDim2.new(1, -54, 0, 6)
    refBtn.BackgroundColor3 = Color3.fromRGB(22, 14, 44); refBtn.BorderSizePixel = 0
    refBtn.Font = Enum.Font.GothamBold; refBtn.TextSize = 12; refBtn.TextColor3 = C.TXTM
    refBtn.Text = "↺"; refBtn.AutoButtonColor = false
    Instance.new("UICorner", refBtn).CornerRadius = UDim.new(0, 5)

    local remBtn = Instance.new("TextButton", row)
    remBtn.Size = UDim2.new(0, 24, 0, 20); remBtn.Position = UDim2.new(1, -26, 0, 6)
    remBtn.BackgroundColor3 = Color3.fromRGB(60, 12, 12); remBtn.BorderSizePixel = 0
    remBtn.Font = Enum.Font.GothamBold; remBtn.TextSize = 14; remBtn.TextColor3 = Color3.fromRGB(200,60,60)
    remBtn.Text = "✕"; remBtn.AutoButtonColor = false
    Instance.new("UICorner", remBtn).CornerRadius = UDim.new(0, 5)
    remBtn.MouseButton1Click:Connect(function()
        for i, ww in ipairs(watchList) do
            if ww.userId == w.userId then table.remove(watchList, i); break end
        end
        saveWatchList()
        if watchRows[w.userId] then
            pcall(function() watchRows[w.userId].row:Destroy() end)
            watchRows[w.userId] = nil
        end
        updateWatchContainerHeight()
        notify("Removed", "Stopped tracking @" .. w.username, 3)
    end)

    local cJobBtn = Instance.new("TextButton", row)
    cJobBtn.Size = UDim2.new(0.5, -5, 0, 22); cJobBtn.Position = UDim2.new(0, 6, 1, -27)
    cJobBtn.BackgroundColor3 = Color3.fromRGB(12, 48, 52); cJobBtn.BorderSizePixel = 0
    cJobBtn.Font = Enum.Font.GothamBold; cJobBtn.TextSize = 10; cJobBtn.TextColor3 = C.TEAL
    cJobBtn.Text = "📋 Copy Job ID"; cJobBtn.AutoButtonColor = false
    Instance.new("UICorner", cJobBtn).CornerRadius = UDim.new(0, 5)

    local joinBtn = Instance.new("TextButton", row)
    joinBtn.Size = UDim2.new(0.5, -5, 0, 22); joinBtn.Position = UDim2.new(0.5, 1, 1, -27)
    joinBtn.BackgroundColor3 = Color3.fromRGB(22, 42, 18); joinBtn.BorderSizePixel = 0
    joinBtn.Font = Enum.Font.GothamBold; joinBtn.TextSize = 10; joinBtn.TextColor3 = C.TXTM
    joinBtn.Text = "⚡ Join"; joinBtn.AutoButtonColor = false
    Instance.new("UICorner", joinBtn).CornerRadius = UDim.new(0, 5)

    local entry = {
        row         = row,
        dot         = dot,
        statusLbl   = statusLbl,
        locationLbl = locationLbl,
        joinBtn     = joinBtn,
        cJobBtn     = cJobBtn,
        lastStatus  = "unknown",
        lastPlaceId = nil,
        lastGameId  = nil,
        lastJobId   = nil,
    }
    watchRows[w.userId] = entry

    cJobBtn.MouseButton1Click:Connect(function()
        if entry.lastStatus == "unknown" then
            notify("Watch List", "Still checking status for @" .. w.username, 3); return
        end

        if entry.lastStatus ~= "in_game" then
            notify("Not In Game", "@" .. w.username .. " is " .. (STATUS_LABELS[entry.lastStatus] or "offline") .. " — no Job ID available", 4)
            return
        end

        local isHere = false
        for _, p2 in ipairs(Players:GetPlayers()) do
            if p2.UserId == w.userId then isHere = true; break end
        end

        if isHere then
            local jid = game.JobId
            entry.lastJobId = jid
            pcall(function() setclipboard(jid) end)
            specJobBox.Text = jid
            local o = cJobBtn.Text; cJobBtn.Text = "✓ Copied!"
            TweenService:Create(cJobBtn, TweenInfo.new(0.1), {BackgroundColor3 = C.TEAL}):Play()
            notify("Job ID Copied!", "@" .. w.username .. " is in YOUR server — Job ID copied!", 5)
            task.delay(2.5, function()
                if cJobBtn and cJobBtn.Parent then
                    cJobBtn.Text = o
                    TweenService:Create(cJobBtn, TweenInfo.new(0.1), {BackgroundColor3 = Color3.fromRGB(12,48,52)}):Play()
                end
            end)
        else
            if not entry.lastPlaceId then
                notify("No Place ID", "Couldn't determine which game @" .. w.username .. " is in", 4); return
            end
            local o = cJobBtn.Text
            cJobBtn.Text = "⋯ Fetching..."
            cJobBtn.TextColor3 = C.TXTM
            task.spawn(function()
                local servers = getServers(entry.lastPlaceId, 100)
                if not cJobBtn or not cJobBtn.Parent then return end
                if #servers > 0 then
                    table.sort(servers, function(a,b) return (a.playing or 0) < (b.playing or 0) end)
                    local jid = servers[1].id
                    entry.lastJobId = jid
                    pcall(function() setclipboard(jid) end)
                    specJobBox.Text  = jid
                    cJobBtn.Text = "✓ Copied!"
                    cJobBtn.TextColor3 = C.TEAL
                    TweenService:Create(cJobBtn, TweenInfo.new(0.1), {BackgroundColor3 = C.TEAL}):Play()
                    notify("Job ID Copied!", "@" .. w.username .. "'s game: Job ID copied + filled in Join box!", 5)
                    task.delay(2.5, function()
                        if cJobBtn and cJobBtn.Parent then
                            cJobBtn.Text = o; cJobBtn.TextColor3 = C.TEAL
                            TweenService:Create(cJobBtn, TweenInfo.new(0.1), {BackgroundColor3 = Color3.fromRGB(12,48,52)}):Play()
                        end
                    end)
                else
                    cJobBtn.Text = "No servers found"
                    cJobBtn.TextColor3 = C.OFF
                    notify("No Servers", "No public servers found for @" .. w.username .. "'s game", 4)
                    task.delay(3, function()
                        if cJobBtn and cJobBtn.Parent then
                            cJobBtn.Text = o; cJobBtn.TextColor3 = C.TEAL
                            TweenService:Create(cJobBtn, TweenInfo.new(0.1), {BackgroundColor3 = Color3.fromRGB(12,48,52)}):Play()
                        end
                    end)
                end
            end)
        end
    end)

    local function refreshRow()
        refBtn.Text = "↻"
        task.spawn(function()
            local status, placeId, gameId, loc = fetchPresence(w.userId)
            entry.lastStatus  = status
            entry.lastPlaceId = placeId
            entry.lastGameId  = gameId
            if status ~= "in_game" then entry.lastJobId = nil end

            local col  = STATUS_COLORS[status] or STATUS_COLORS.unknown
            local icon = STATUS_ICONS[status]  or "⋯"
            local lbl  = STATUS_LABELS[status] or "Unknown"

            dot.BackgroundColor3 = col
            statusLbl.TextColor3 = col
            statusLbl.Text = icon .. "  " .. lbl

            if status == "in_game" then
                local gameName = placeId and getGameName(placeId) or (loc ~= "" and loc or "Unknown Game")
                locationLbl.Text = "Playing: " .. gameName:sub(1, 40)
                joinBtn.BackgroundColor3 = Color3.fromRGB(16, 50, 16)
                joinBtn.TextColor3 = C.ON
                joinBtn.Text = "⚡ Join"
                cJobBtn.TextColor3 = C.TEAL
                cJobBtn.Text = "📋 Copy Job ID"
            elseif status == "online" then
                locationLbl.Text = "On Roblox website"
                joinBtn.BackgroundColor3 = Color3.fromRGB(22, 42, 18)
                joinBtn.TextColor3 = C.TXTM
                joinBtn.Text = "⚡ Join"
                cJobBtn.Text = "📋 Copy Job ID"
                cJobBtn.TextColor3 = Color3.fromRGB(50, 80, 80)
            else
                locationLbl.Text = status == "offline" and "Last seen: unknown" or "Checking..."
                joinBtn.BackgroundColor3 = Color3.fromRGB(22, 42, 18)
                joinBtn.TextColor3 = C.TXTM
                joinBtn.Text = "⚡ Join"
                cJobBtn.Text = "📋 Copy Job ID"
                cJobBtn.TextColor3 = Color3.fromRGB(50, 80, 80)
            end

            TweenService:Create(row, TweenInfo.new(0.2), {BackgroundColor3 = Color3.fromRGB(22,14,38)}):Play()
            task.delay(0.4, function()
                if row and row.Parent then
                    TweenService:Create(row, TweenInfo.new(0.3), {BackgroundColor3 = C.PANEL}):Play()
                end
            end)
            refBtn.Text = "↺"
        end)
    end

    refBtn.MouseButton1Click:Connect(refreshRow)

    joinBtn.MouseButton1Click:Connect(function()
        if entry.lastStatus ~= "in_game" or not entry.lastPlaceId then
            notify("Can't Join", "@" .. w.username .. " is not currently in a game", 3); return
        end
        joinBtn.Text = "..."
        notify("Joining", "Jumping into @" .. w.username .. "'s game...", 4)
        task.spawn(function()
            local servers = getServers(entry.lastPlaceId, 100)
            if #servers > 0 then
                table.sort(servers, function(a,b) return (a.playing or 0) < (b.playing or 0) end)
                joinByJobId(entry.lastPlaceId, servers[1].id)
            else
                joinByPlaceId(entry.lastPlaceId)
            end
        end)
    end)

    refreshRow()
    return entry
end

local function rebuildAllWatchRows()
    for uid, entry in pairs(watchRows) do
        pcall(function() entry.row:Destroy() end)
    end
    watchRows = {}
    for _, w in ipairs(watchList) do
        buildWatchRow(w)
    end
    updateWatchContainerHeight()
end

local function addToWatchList(rawName)
    local name = rawName:match("^%s*(.-)%s*$")
    if name == "" then notify("Watch List", "Enter a username", 3); return end

    local nameLower = name:lower()
    for _, w in ipairs(watchList) do
        if w.username:lower() == nameLower then
            notify("Already Added", "@" .. w.username .. " is already in your watch list", 3)
            return
        end
    end

    awAddBtn.Text = "..."
    awBox.Text = ""
    task.spawn(function()
        local userId = getUserId(name)
        if not userId then
            awAddBtn.Text = "+ Add"
            notify("Not Found", "Couldn't find player '" .. name .. "'", 4)
            return
        end
        local confirmedName = getUsername(userId) or name
        local displayName   = getDisplayName(userId) or confirmedName

        for _, w in ipairs(watchList) do
            if w.userId == userId then
                awAddBtn.Text = "+ Add"
                notify("Already Added", "@" .. confirmedName .. " is already in your watch list", 3)
                return
            end
        end

        local entry = {userId = userId, username = confirmedName, displayName = displayName}
        table.insert(watchList, entry)
        saveWatchList()
        buildWatchRow(entry)
        updateWatchContainerHeight()
        awAddBtn.Text = "+ Add"
        notify("Added!", "@" .. confirmedName .. " added to watch list", 4)
    end)
end

awAddBtn.MouseButton1Click:Connect(function() addToWatchList(awBox.Text) end)
awBox.FocusLost:Connect(function(enter) if enter then addToWatchList(awBox.Text) end end)

rebuildAllWatchRows()

task.spawn(function()
    while true do
        task.wait(12)
        for _, w in ipairs(watchList) do
            if watchRows[w.userId] then
                local entry = watchRows[w.userId]
                task.spawn(function()
                    local status, placeId, gameId, loc = fetchPresence(w.userId)
                    if not entry.row or not entry.row.Parent then return end
                    local prev = entry.lastStatus
                    entry.lastStatus  = status
                    entry.lastPlaceId = placeId
                    entry.lastGameId  = gameId

                    local col  = STATUS_COLORS[status] or STATUS_COLORS.unknown
                    local icon = STATUS_ICONS[status]  or "⋯"
                    local lbl  = STATUS_LABELS[status] or "Unknown"

                    entry.dot.BackgroundColor3 = col
                    entry.statusLbl.TextColor3 = col
                    entry.statusLbl.Text = icon .. "  " .. lbl

                    if status == "in_game" then
                        local gameName = placeId and getGameName(placeId) or (loc ~= "" and loc or "Unknown Game")
                        entry.locationLbl.Text = "Playing: " .. gameName:sub(1, 40)
                        entry.joinBtn.BackgroundColor3 = Color3.fromRGB(16, 50, 16)
                        entry.joinBtn.TextColor3 = C.ON
                        entry.joinBtn.Text = "⚡ Join"
                        if entry.cJobBtn and entry.cJobBtn.Parent then
                            entry.cJobBtn.TextColor3 = C.TEAL
                            entry.cJobBtn.Text = "📋 Copy Job ID"
                        end
                    elseif status == "online" then
                        entry.locationLbl.Text = "On Roblox website"
                        entry.joinBtn.BackgroundColor3 = Color3.fromRGB(22, 42, 18)
                        entry.joinBtn.TextColor3 = C.TXTM
                        entry.joinBtn.Text = "⚡ Join"
                        if entry.cJobBtn and entry.cJobBtn.Parent then
                            entry.cJobBtn.TextColor3 = Color3.fromRGB(50, 80, 80)
                            entry.cJobBtn.Text = "📋 Copy Job ID"
                        end
                    else
                        entry.locationLbl.Text = status == "offline" and "Last seen: unknown" or ""
                        entry.joinBtn.BackgroundColor3 = Color3.fromRGB(22, 42, 18)
                        entry.joinBtn.TextColor3 = C.TXTM
                        entry.joinBtn.Text = "⚡ Join"
                        if entry.cJobBtn and entry.cJobBtn.Parent then
                            entry.cJobBtn.TextColor3 = Color3.fromRGB(50, 80, 80)
                            entry.cJobBtn.Text = "📋 Copy Job ID"
                        end
                    end

                    if prev ~= "unknown" and prev ~= status then
                        local changeMsg = ""
                        if status == "in_game" then
                            changeMsg = "@" .. w.username .. " just started playing!"
                        elseif status == "online" and prev == "offline" then
                            changeMsg = "@" .. w.username .. " just came online!"
                        elseif status == "offline" and prev ~= "offline" then
                            changeMsg = "@" .. w.username .. " went offline."
                        end
                        if changeMsg ~= "" then notify("Watch List", changeMsg, 5) end
                    end
                end)
            end
        end
    end
end)

-- ================================================================
--  SECTION 8 - QUICK ACTIONS
-- ================================================================
Sec("Quick Actions")

Act("Rejoin  (random new server)", C.BLUE, function()
    task.spawn(function() joinNewServer(game.PlaceId) end)
end)

Act("Rejoin Same Server", Color3.fromRGB(30, 20, 65), function()
    task.spawn(function() joinByJobId(game.PlaceId, game.JobId) end)
end)

local _, serverInfoLbl = ResultCard(60, "Press button below to see server info")
Act("Show This Server's Info", Color3.fromRGB(30, 40, 80), function()
    local pid = tostring(game.PlaceId)
    local jid = game.JobId
    local playerList = {}
    for _, p2 in ipairs(Players:GetPlayers()) do table.insert(playerList, p2.DisplayName) end
    serverInfoLbl.Text =
        "Place ID:  " .. pid ..
        "\nJob ID:     " .. jid ..
        "\nPlayers:   " .. table.concat(playerList, ", ")
    serverInfoLbl.TextColor3 = C.TXT
    pcall(function() setclipboard(jid) end)
    notify("Server Info", "Place: " .. pid .. " | Job ID copied!", 4)
end)

-- ================================================================
--  STARTUP
-- ================================================================
notify("Loaded!", "Lilly's Snipes ready", 5)

Features & Information

- watchlist - player info - join anyone - server hopper - can see whos online or in a game, they must have their activity as on
#universal#cracked

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts