-- ULTIMATE ServerHopper3000 + PlayerFinder3000 v3 -- Mobile + PC Drag | Scrollable Guide | Perfect for Delta Auto-Execute local Players = game:GetService("Players") local TeleportService = game:GetService("TeleportService") local HttpService = game:GetService("HttpService") local UserInputService = game:GetService("UserInputService") local player = Players.LocalPlayer local FOLDER = "ServerHopperStorage" local IGNORED_FILE = FOLDER.."/IgnoredServers" local TOGGLE_FILE = FOLDER.."/PlayerFinderToggleState" local NAME_FILE = FOLDER.."/PlayerFinderTextboxName" if not isfolder(FOLDER) then makefolder(FOLDER) end if not isfile(IGNORED_FILE) then writefile(IGNORED_FILE, "") end if not isfile(TOGGLE_FILE) then writefile(TOGGLE_FILE, "false") end if not isfile(NAME_FILE) then writefile(NAME_FILE, "") end local function getToggleState() return readfile(TOGGLE_FILE):lower() == "true" end local function getTargetName() return readfile(NAME_FILE):gsub("^%s*(.-)%s*$", "%1") end local function setToggle(s) writefile(TOGGLE_FILE, tostring(s)) end local function setName(n) writefile(NAME_FILE, n) end local function loadIgnored() local t = {} for line in (readfile(IGNORED_FILE)):gmatch("[^\r\n]+") do if line:match("^[%w-]+$") then table.insert(t, line) end end return t end local function ignoreCurrentServer() if game.JobId ~= "" then appendfile(IGNORED_FILE, game.JobId.."\n"..game.PlaceId.."\n") end end -- ==================== MAIN GUI ==================== local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "UltimateHopper3000" ScreenGui.ResetOnSpawn = false ScreenGui.Parent = player:WaitForChild("PlayerGui") local MainFrame = Instance.new("Frame") MainFrame.Size = UDim2.new(0, 340, 0, 220) MainFrame.Position = UDim2.new(0.5, -170, 0.5, -110) MainFrame.BackgroundColor3 = Color3.fromRGB(22, 22, 33) MainFrame.BorderSizePixel = 0 MainFrame.ClipsDescendants = true MainFrame.Parent = ScreenGui -- Rounded corners local Corner = Instance.new("UICorner", MainFrame) Corner.CornerRadius = UDim.new(0, 12) local Stroke = Instance.new("UIStroke", MainFrame) Stroke.Color = Color3.fromRGB(255, 80, 120) Stroke.Thickness = 2.5 local Title = Instance.new("TextLabel") Title.Size = UDim2.new(1,0,0,45) Title.BackgroundTransparency = 1 Title.Text = "ServerHopper3000" Title.TextColor3 = Color3.fromRGB(255, 100, 140) Title.Font = Enum.Font.GothamBlack Title.TextSize = 22 Title.Parent = MainFrame -- Mode Switch Button local ModeBtn = Instance.new("TextButton") ModeBtn.Size = UDim2.new(0,26,0,26) ModeBtn.Position = UDim2.new(1,-34,0,8) ModeBtn.BackgroundColor3 = Color3.fromRGB(100, 100, 255) ModeBtn.Text = "Switch" ModeBtn.TextSize = 10 ModeBtn.Font = Enum.Font.GothamBold local mc = Instance.new("UICorner", ModeBtn); mc.CornerRadius = UDim.new(0,8) ModeBtn.Parent = MainFrame -- =============== SERVER HOPPER MODE =============== local HopBtn = Instance.new("TextButton") HopBtn.Size = UDim2.new(0.88,0,0,48) HopBtn.Position = UDim2.new(0.06,0,0.28,0) HopBtn.BackgroundColor3 = Color3.fromRGB(50, 180, 80) HopBtn.Text = "ServerHop" HopBtn.TextColor3 = Color3.new(1,1,1) HopBtn.Font = Enum.Font.GothamBold HopBtn.TextSize = 20 local hc = Instance.new("UICorner", HopBtn); hc.CornerRadius = UDim.new(0,10) HopBtn.Visible = true HopBtn.Parent = MainFrame local ClearBtn = Instance.new("TextButton") ClearBtn.Size = UDim2.new(0.88,0,0,40) ClearBtn.Position = UDim2.new(0.06,0,0.68,0) ClearBtn.BackgroundColor3 = Color3.fromRGB(200, 60, 60) ClearBtn.Text = "Clear Ignore List" ClearBtn.TextColor3 = Color3.new(1,1,1) ClearBtn.Font = Enum.Font.Gotham ClearBtn.TextSize = 16 local cc = Instance.new("UICorner", ClearBtn); cc.CornerRadius = UDim.new(0,10) ClearBtn.Visible = true ClearBtn.Parent = MainFrame -- =============== PLAYER FINDER MODE =============== local FindBtn = Instance.new("TextButton") FindBtn.Size = UDim2.new(0.88,0,0,48) FindBtn.Position = UDim2.new(0.06,0,0.22,0) FindBtn.BackgroundColor3 = Color3.fromRGB(90, 90, 220) FindBtn.Text = "Click to start finding (read guide first)" FindBtn.TextColor3 = Color3.new(1,1,1) FindBtn.Font = Enum.Font.GothamBold FindBtn.TextSize = 15 local fc = Instance.new("UICorner", FindBtn); fc.CornerRadius = UDim.new(0,10) FindBtn.Visible = false FindBtn.Parent = MainFrame local TargetBox = Instance.new("TextBox") TargetBox.Size = UDim2.new(0.88,0,0,40) TargetBox.Position = UDim2.new(0.06,0,0.55,0) TargetBox.BackgroundColor3 = Color3.fromRGB(45,45,65) TargetBox.PlaceholderText = "Player name here" TargetBox.Text = "" TargetBox.TextColor3 = Color3.new(1,1,1) TargetBox.Font = Enum.Font.Gotham TargetBox.TextSize = 16 local tc = Instance.new("UICorner", TargetBox); tc.CornerRadius = UDim.new(0,10) TargetBox.Visible = false TargetBox.Parent = MainFrame local GuideBtn = Instance.new("TextButton") GuideBtn.Size = UDim2.new(0,28,0,28) GuideBtn.Position = UDim2.new(0,8,0,8) GuideBtn.BackgroundTransparency = 0.4 GuideBtn.Text = "Guide" GuideBtn.TextSize = 14 GuideBtn.Visible = false local gc = Instance.new("UICorner", GuideBtn); gc.CornerRadius = UDim.new(0,8) GuideBtn.Parent = MainFrame -- =============== SCROLLABLE GUIDE GUI =============== local GuideGui = Instance.new("ScreenGui") GuideGui.Parent = player.PlayerGui local GuideFrame = Instance.new("Frame") GuideFrame.Size = UDim2.new(0, 360, 0, 480) GuideFrame.Position = UDim2.new(0.5, -180, 0.5, -240) GuideFrame.BackgroundColor3 = Color3.fromRGB(20,20,35) GuideFrame.Visible = false GuideFrame.Parent = GuideGui local gcorner = Instance.new("UICorner", GuideFrame); gcorner.CornerRadius = UDim.new(0,14) local gstroke = Instance.new("UIStroke", GuideFrame) gstroke.Color = Color3.fromRGB(255,120,180) gstroke.Thickness = 2 local GuideTitle = Instance.new("TextLabel") GuideTitle.Size = UDim2.new(1,0,0,40) GuideTitle.BackgroundTransparency = 1 GuideTitle.Text = "PlayerFinder3000 Guide" GuideTitle.TextColor3 = Color3.fromRGB(255,140,180) GuideTitle.Font = Enum.Font.GothamBold GuideTitle.TextSize = 18 GuideTitle.Parent = GuideFrame local CloseGuideBtn = Instance.new("TextButton") CloseGuideBtn.Size = UDim2.new(0,32,0,32) CloseGuideBtn.Position = UDim2.new(1,-38,0,4) CloseGuideBtn.BackgroundColor3 = Color3.fromRGB(220,60,60) CloseGuideBtn.Text = "X" CloseGuideBtn.TextColor3 = Color3.new(1,1,1) local xc = Instance.new("UICorner", CloseGuideBtn); xc.CornerRadius = UDim.new(0,10) CloseGuideBtn.Parent = GuideFrame CloseGuideBtn.MouseButton1Click:Connect(function() GuideFrame.Visible = false end) local ScrollingFrame = Instance.new("ScrollingFrame") ScrollingFrame.Size = UDim2.new(1,-20,1,-50) ScrollingFrame.Position = UDim2.new(0,10,0,40) ScrollingFrame.BackgroundTransparency = 1 ScrollingFrame.ScrollBarThickness = 6 ScrollingFrame.CanvasSize = UDim2.new(0,0,0,800) ScrollingFrame.Parent = GuideFrame local GuideText = Instance.new("TextLabel") GuideText.Size = UDim2.new(1,-10,0,800) GuideText.Position = UDim2.new(0,5,0,0) GuideText.BackgroundTransparency = 1 GuideText.TextColor3 = Color3.new(0.95,0.95,0.95) GuideText.TextWrapped = true GuideText.TextYAlignment = Enum.TextYAlignment.Top GuideText.Font = Enum.Font.Gotham GuideText.TextSize = 15 GuideText.Text = [[How to use PlayerFinder3000 • Put this script in Delta's Auto-Execute folder • Join the game you want to hunt in • Switch to PlayerFinder3000 mode • Type the EXACT username or display name • Press the button → it will hop forever until found! The script remembers your target even after rejoin! It ignores every server that doesn't have the player. Player found? → Auto stops + clears name Stuck in infinite hop? → Open ZArchiver → search "ServerHopperStorage" → Edit PlayerFinderTextboxName → delete everything → Edit PlayerFinderToggleState → write "false" → Done! You're free PRO TIP: Always clear ignored servers before hunting a new player! Happy hunting! Go find those YouTubers]] GuideText.Parent = ScrollingFrame -- =============== SUPER SMOOTH DRAG (MOBILE + PC) =============== local function makeDraggable(frame) local dragging = false local dragInput, mousePos, framePos frame.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true mousePos = input.Position framePos = frame.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) end end) frame.InputChanged:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then dragInput = input end end) UserInputService.InputChanged:Connect(function(input) if dragging and (input == dragInput) then local delta = input.Position - mousePos frame.Position = UDim2.new(framePos.X.Scale, framePos.X.Offset + delta.X, framePos.Y.Scale, framePos.Y.Offset + delta.Y) end end) end makeDraggable(MainFrame) makeDraggable(GuideFrame) -- =============== MODE SWITCHING =============== local isFinderMode = false local function switchMode() isFinderMode = not isFinderMode Title.Text = isFinderMode and "PlayerFinder3000" or "ServerHopper3000" ModeBtn.BackgroundColor3 = isFinderMode and Color3.fromRGB(200,80,200) or Color3.fromRGB(100,100,255) HopBtn.Visible = not isFinderMode ClearBtn.Visible = not isFinderMode FindBtn.Visible = isFinderMode TargetBox.Visible = isFinderMode GuideBtn.Visible = isFinderMode if isFinderMode then TargetBox.Text = getTargetName() FindBtn.Text = getToggleState() and "Finding..." or "Click to start finding (read guide first)" end end ModeBtn.MouseButton1Click:Connect(switchMode) GuideBtn.MouseButton1Click:Connect(function() GuideFrame.Visible = true end) -- =============== SERVER HOP FUNCTION =============== local function hopToRandom(exclude) local data = HttpService:JSONDecode(game:HttpGet("https://games.roblox.com/v1/games/"..game.PlaceId.."/servers/Public?sortOrder=Asc&limit=100")) local servers = {} for _,v in pairs(data.data) do if v.playing < v.maxPlayers and v.id ~= game.JobId and not table.find(exclude, v.id) then table.insert(servers, v.id) end end if #servers == 0 then task.wait(3); return hopToRandom(exclude) end TeleportService:TeleportToPlaceInstance(game.PlaceId, servers[math.random(#servers)], player) end -- =============== PLAYER FINDER =============== local function startFinding() local name = TargetBox.Text:gsub("^%s*(.-)%s*$", "%1") if name == "" then FindBtn.Text = "Enter a name first!" task.wait(2) FindBtn.Text = "Click to start finding (read guide first)" return end setName(name) setToggle(true) FindBtn.Text = "Finding " .. name .. "..." task.spawn(function() while getToggleState() and getTargetName() == name do local found = false for _, p in Players:GetPlayers() do if p.Name:lower() == name:lower() or p.DisplayName:lower() == name:lower() then found = true; break end end if found then FindBtn.Text = "FOUND " .. name .. "!" FindBtn.BackgroundColor3 = Color3.fromRGB(50,220,80) setToggle(false) setName("") TargetBox.Text = "" task.wait(5) FindBtn.Text = "Click to start finding (read guide first)" FindBtn.BackgroundColor3 = Color3.fromRGB(90,90,220) break else ignoreCurrentServer() hopToRandom(loadIgnored()) end task.wait(1) end end) end FindBtn.MouseButton1Click:Connect(function() if getToggleState() then setToggle(false) FindBtn.Text = "Stopped" task.wait(1.5) FindBtn.Text = "Click to start finding (read guide first)" else startFinding() end end) HopBtn.MouseButton1Click:Connect(function() HopBtn.Text = "Hopping..." ignoreCurrentServer() hopToRandom(loadIgnored()) end) ClearBtn.MouseButton1Click:Connect(function() writefile(IGNORED_FILE, "") ClearBtn.Text = "Cleared!" task.wait(1) ClearBtn.Text = "Clear Ignore List" end) -- Auto-start if was active if getToggleState() and getTargetName() ~= "" then switchMode() task.wait(0.5) startFinding() end print("ServerHopper3000 + PlayerFinder3000 v3 LOADED! Mobile-ready + Scrollable Guide")