
KeylessUniversal

-- 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")



Bad script doesn't work anymore
@Moonsec ?????
Bad Script
@Moonsec where in the script does it hack your account? Its literally open source, get a brain, also you're a member farmer
@jjrrooadline that moonsec guy is spam disliking and saying every script is a virus 😭 hell nah man i cant belive they say a god * script IS a virus 🥀 i dint even add a webhook on it even tho most executors block webhooks that give information not actually send..
@davidisnotafurry frrrrr
Is this AI generated or smth
@PlayerZN so? I mean im at least trying to help others with server hopping problems.
thats so ai twin
@ojtek whats the problem on that??? Im tryna make unique scripts that can actually help..
"its aii its aiiii" yes it is cry abt it better having a script than not having a script.