local players = game:GetService("Players") local teleportService = game:GetService("TeleportService") local httpService = game:GetService("HttpService") local localPlayer = players.LocalPlayer local placeId = game.PlaceId local jobId = game.JobId local maxPing = 300 local searchTimeout = 7.3 local gui = Instance.new("ScreenGui") gui.Name = "hopper" gui.ResetOnSpawn = false gui.Parent = game:GetService("CoreGui") local loadingFrame = Instance.new("Frame") loadingFrame.Size = UDim2.new(0, 220, 0, 80) loadingFrame.Position = UDim2.new(0.5, -110, 0.5, -40) loadingFrame.BackgroundColor3 = Color3.fromRGB(0, 0, 0) loadingFrame.BorderSizePixel = 0 loadingFrame.Parent = gui local loadingText = Instance.new("TextLabel") loadingText.Size = UDim2.new(1, 0, 0, 20) loadingText.Position = UDim2.new(0, 0, 0.3, 0) loadingText.BackgroundTransparency = 1 loadingText.Text = "loading..." loadingText.TextColor3 = Color3.fromRGB(150, 150, 150) loadingText.TextSize = 16 loadingText.Font = Enum.Font.SourceSans loadingText.Parent = loadingFrame local creditLoad = Instance.new("TextLabel") creditLoad.Size = UDim2.new(1, 0, 0, 16) creditLoad.Position = UDim2.new(0, 0, 0.6, 0) creditLoad.BackgroundTransparency = 1 creditLoad.Text = "made by xarvok" creditLoad.TextColor3 = Color3.fromRGB(100, 100, 100) creditLoad.TextSize = 12 creditLoad.Font = Enum.Font.SourceSans creditLoad.Parent = loadingFrame task.wait(0.8) loadingFrame:Destroy() local frame = Instance.new("Frame") frame.Size = UDim2.new(0, 320, 0, 160) frame.Position = UDim2.new(0.5, -160, 0.4, -80) frame.BackgroundColor3 = Color3.fromRGB(0, 0, 0) frame.BorderSizePixel = 0 frame.Parent = gui local topBar = Instance.new("Frame") topBar.Size = UDim2.new(1, 0, 0, 26) topBar.BackgroundColor3 = Color3.fromRGB(15, 15, 15) topBar.BorderSizePixel = 0 topBar.Parent = frame local title = Instance.new("TextLabel") title.Size = UDim2.new(1, -80, 1, 0) title.Position = UDim2.new(0, 10, 0, 0) title.BackgroundTransparency = 1 title.Text = "server hopper" title.TextColor3 = Color3.fromRGB(180, 180, 180) title.TextSize = 14 title.Font = Enum.Font.SourceSans title.TextXAlignment = Enum.TextXAlignment.Left title.Parent = topBar local credit = Instance.new("TextLabel") credit.Size = UDim2.new(0, 100, 1, 0) credit.Position = UDim2.new(1, -130, 0, 0) credit.BackgroundTransparency = 1 credit.Text = "by xarvok" credit.TextColor3 = Color3.fromRGB(100, 100, 100) credit.TextSize = 11 credit.Font = Enum.Font.SourceSans credit.Parent = topBar local close = Instance.new("TextButton") close.Size = UDim2.new(0, 30, 0, 18) close.Position = UDim2.new(1, -32, 0, 4) close.BackgroundColor3 = Color3.fromRGB(30, 30, 30) close.BorderSizePixel = 0 close.Text = "x" close.TextColor3 = Color3.fromRGB(150, 150, 150) close.TextSize = 14 close.Font = Enum.Font.SourceSans close.Parent = topBar local leftSection = Instance.new("Frame") leftSection.Size = UDim2.new(0, 80, 0, 90) leftSection.Position = UDim2.new(0, 10, 0, 36) leftSection.BackgroundTransparency = 1 leftSection.Parent = frame local maxLabel = Instance.new("TextLabel") maxLabel.Size = UDim2.new(1, 0, 0, 18) maxLabel.Position = UDim2.new(0, 0, 0, 0) maxLabel.BackgroundTransparency = 1 maxLabel.Text = "max players" maxLabel.TextColor3 = Color3.fromRGB(120, 120, 120) maxLabel.TextSize = 12 maxLabel.Font = Enum.Font.SourceSans maxLabel.Parent = leftSection local maxBox = Instance.new("TextBox") maxBox.Size = UDim2.new(0, 50, 0, 24) maxBox.Position = UDim2.new(0, 0, 0, 22) maxBox.BackgroundColor3 = Color3.fromRGB(25, 25, 25) maxBox.BorderSizePixel = 0 maxBox.Text = "1" maxBox.TextColor3 = Color3.fromRGB(255, 255, 255) maxBox.TextSize = 14 maxBox.Font = Enum.Font.SourceSans maxBox.ClearTextOnFocus = true maxBox.Parent = leftSection local midSection = Instance.new("Frame") midSection.Size = UDim2.new(0, 130, 0, 90) midSection.Position = UDim2.new(0, 100, 0, 36) midSection.BackgroundColor3 = Color3.fromRGB(12, 12, 12) midSection.BorderSizePixel = 0 midSection.Parent = frame local curText = Instance.new("TextLabel") curText.Size = UDim2.new(1, -10, 0, 18) curText.Position = UDim2.new(0, 5, 0, 6) curText.BackgroundTransparency = 1 curText.Text = "now: " .. #players:GetPlayers() .. "/" .. players.MaxPlayers curText.TextColor3 = Color3.fromRGB(130, 130, 130) curText.TextSize = 12 curText.Font = Enum.Font.SourceSans curText.Parent = midSection local statText = Instance.new("TextLabel") statText.Size = UDim2.new(1, -10, 0, 22) statText.Position = UDim2.new(0, 5, 0, 26) statText.BackgroundTransparency = 1 statText.Text = "ready" statText.TextColor3 = Color3.fromRGB(0, 200, 255) statText.TextSize = 16 statText.Font = Enum.Font.SourceSansBold statText.Parent = midSection local timeText = Instance.new("TextLabel") timeText.Size = UDim2.new(1, -10, 0, 16) timeText.Position = UDim2.new(0, 5, 0, 50) timeText.BackgroundTransparency = 1 timeText.Text = "timeout: " .. searchTimeout .. "s" timeText.TextColor3 = Color3.fromRGB(90, 90, 90) timeText.TextSize = 11 timeText.Font = Enum.Font.SourceSans timeText.Parent = midSection local rightSection = Instance.new("Frame") rightSection.Size = UDim2.new(0, 70, 0, 90) rightSection.Position = UDim2.new(0, 240, 0, 36) rightSection.BackgroundTransparency = 1 rightSection.Parent = frame local barBg = Instance.new("Frame") barBg.Size = UDim2.new(1, 0, 0, 5) barBg.Position = UDim2.new(0, 0, 0, 10) barBg.BackgroundColor3 = Color3.fromRGB(35, 35, 35) barBg.BorderSizePixel = 0 barBg.Parent = rightSection local barFill = Instance.new("Frame") barFill.Size = UDim2.new(0, 0, 1, 0) barFill.BackgroundColor3 = Color3.fromRGB(0, 200, 255) barFill.BorderSizePixel = 0 barFill.Parent = barBg local warnText = Instance.new("TextLabel") warnText.Size = UDim2.new(1, 0, 0, 50) warnText.Position = UDim2.new(0, 0, 0, 22) warnText.BackgroundTransparency = 1 warnText.Text = "players may join after teleport" warnText.TextColor3 = Color3.fromRGB(110, 100, 60) warnText.TextSize = 10 warnText.Font = Enum.Font.SourceSans warnText.TextWrapped = true warnText.Parent = rightSection local hopBtn = Instance.new("TextButton") hopBtn.Size = UDim2.new(1, -20, 0, 28) hopBtn.Position = UDim2.new(0, 10, 0, 128) hopBtn.BackgroundColor3 = Color3.fromRGB(35, 35, 35) hopBtn.BorderSizePixel = 0 hopBtn.Text = "find server" hopBtn.TextColor3 = Color3.fromRGB(220, 220, 220) hopBtn.TextSize = 14 hopBtn.Font = Enum.Font.SourceSansBold hopBtn.Parent = frame local dragging = false local dragStart, startPos topBar.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = true dragStart = input.Position startPos = frame.Position end end) topBar.InputChanged:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement and dragging then 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 end) topBar.InputEnded:Connect(function() dragging = false end) hopBtn.MouseEnter:Connect(function() if not searching then hopBtn.BackgroundColor3 = Color3.fromRGB(55, 55, 55) end end) hopBtn.MouseLeave:Connect(function() if not searching then hopBtn.BackgroundColor3 = Color3.fromRGB(35, 35, 35) end end) close.MouseEnter:Connect(function() close.BackgroundColor3 = Color3.fromRGB(80, 40, 40) end) close.MouseLeave:Connect(function() close.BackgroundColor3 = Color3.fromRGB(30, 30, 30) end) maxBox.FocusLost:Connect(function() local num = tonumber(maxBox.Text) if not num or num < 0 then maxBox.Text = "1" elseif num > 99 then maxBox.Text = "99" else maxBox.Text = tostring(math.floor(num)) end end) local searching = false local stopSearch = false local function getServers(cursor) cursor = cursor or "" local url = string.format("https://games.roblox.com/v1/games/%d/servers/Public?sortOrder=Asc&limit=100&cursor=%s", placeId, httpService:UrlEncode(cursor)) local success, result = pcall(function() return httpService:JSONDecode(game:HttpGet(url, true)) end) return success and result or nil end local function reset() searching = false stopSearch = false hopBtn.Text = "find server" hopBtn.BackgroundColor3 = Color3.fromRGB(35, 35, 35) barFill.Size = UDim2.new(0, 0, 1, 0) barFill.BackgroundColor3 = Color3.fromRGB(0, 200, 255) end local function hop() if searching then stopSearch = true return end local maxPlayers = tonumber(maxBox.Text) or 1 if maxPlayers < 0 then maxPlayers = 0 end searching = true stopSearch = false hopBtn.Text = "stop" hopBtn.BackgroundColor3 = Color3.fromRGB(120, 70, 30) statText.Text = "searching..." statText.TextColor3 = Color3.fromRGB(255, 190, 0) local start = tick() local seen = {} local nextCursor = "" while searching and not stopSearch do local elapsed = tick() - start barFill.Size = UDim2.new(math.clamp(elapsed / searchTimeout, 0, 1), 0, 1, 0) if elapsed >= searchTimeout then searching = false statText.Text = "failed" statText.TextColor3 = Color3.fromRGB(255, 80, 80) barFill.BackgroundColor3 = Color3.fromRGB(255, 80, 80) reset() return end local data = getServers(nextCursor) if not data then statText.Text = "error" statText.TextColor3 = Color3.fromRGB(255, 80, 80) barFill.BackgroundColor3 = Color3.fromRGB(255, 80, 80) reset() return end if #data.data == 0 then statText.Text = "failed" statText.TextColor3 = Color3.fromRGB(255, 80, 80) barFill.BackgroundColor3 = Color3.fromRGB(255, 80, 80) reset() return end for _, server in ipairs(data.data) do if not searching or stopSearch then break end if tick() - start >= searchTimeout then statText.Text = "failed" statText.TextColor3 = Color3.fromRGB(255, 80, 80) barFill.BackgroundColor3 = Color3.fromRGB(255, 80, 80) reset() return end if server.id ~= jobId and not seen[server.id] then seen[server.id] = true if server.playing <= maxPlayers and (not server.ping or server.ping <= maxPing) then searching = false statText.Text = "found" statText.TextColor3 = Color3.fromRGB(0, 255, 120) barFill.BackgroundColor3 = Color3.fromRGB(0, 255, 120) local ok = pcall(function() teleportService:TeleportToPlaceInstance(placeId, server.id, localPlayer) end) if ok then return else searching = true statText.Text = "retry..." statText.TextColor3 = Color3.fromRGB(255, 190, 0) barFill.BackgroundColor3 = Color3.fromRGB(0, 200, 255) end end end task.wait(0.02) end nextCursor = data.nextPageCursor or "" if nextCursor == "" then statText.Text = "failed" statText.TextColor3 = Color3.fromRGB(255, 80, 80) barFill.BackgroundColor3 = Color3.fromRGB(255, 80, 80) reset() return end end if stopSearch then statText.Text = "stopped" statText.TextColor3 = Color3.fromRGB(140, 140, 140) end reset() end hopBtn.MouseButton1Click:Connect(hop) close.MouseButton1Click:Connect(function() stopSearch = true searching = false gui:Destroy() end) players.PlayerAdded:Connect(function() curText.Text = "now: " .. #players:GetPlayers() .. "/" .. players.MaxPlayers end) players.PlayerRemoving:Connect(function() curText.Text = "now: " .. #players:GetPlayers() .. "/" .. players.MaxPlayers end)