--// SERVICES
local RunService = game:GetService("RunService")
local TeleportService = game:GetService("TeleportService")
local HttpService = game:GetService("HttpService")
local Players = game:GetService("Players")
local VirtualUser = game:GetService("VirtualUser")
local lp = Players.LocalPlayer
--// CONFIG
local FIREBASE_URL = "https://hopper-d0883-default-rtdb.firebaseio.com/"
local RAW_URL = "https://pastebin.com/raw/BhBz7UQU"
local HOP_INTERVAL = 6
local SERVER_TIMEOUT = 90
local MIN_VALUE = 5e6
local EXTRA_MIN_VALUE = 5e6
math.randomseed(os.time() + tick() + lp.UserId)
--// VPS OPTIMISATION
RunService:Set3dRenderingEnabled(false)
setfpscap(10)
settings().Rendering.QualityLevel = Enum.QualityLevel.Level01
--// WEBHOOKS
local WEBHOOKS = {
PUB = {
[5] = "",
[100] = "WEBHOOK_100",
[500] = "WEBHOOK_500"
},
PRIV = {
[5] = "https://discord.com/api/webhooks/1462565974598352977/vTfB8UkaoIHH3Hf4bepLG64QUJQHHuNlZgm9euMBKPIo0WgtgA8k0tryX1P1mTMtc2cn",
[100] = "https://discord.com/api/webhooks/1462566120174391413/yK9kAe-tm05DdZmyk79AmzPd2JYdkE-Tjw0FRpWskOxeeIvkb-xUZbGK8NJ1kjz_mkC",
[500] = "https://discord.com/api/webhooks/1462566252634706003/Y81n5RMxNdrhqLl8FSo5ApabmXUo5PBDSRG8IuxvukZ6oSZnNtGuanhxh97YNjFpWE46"
}
}
--// HTTP SHORTCUT
local request = syn and syn.request or http and http.request or http_request or request
--// BRIDGE
local Bridge = {}
function Bridge.Occupy(jobId)
pcall(function()
HttpService:RequestAsync({
Url = FIREBASE_URL.."active_servers/"..jobId..".json",
Method = "PUT",
Body = HttpService:JSONEncode({bot=lp.Name,time=os.time()})
})
HttpService:RequestAsync({
Url = FIREBASE_URL.."blacklist_servers/"..jobId..".json",
Method = "PUT",
Body = HttpService:JSONEncode({time=os.time()})
})
end)
end
function Bridge.IsBlocked(jobId, path)
local ok,res = pcall(function()
return HttpService:GetAsync(FIREBASE_URL..path.."/"..jobId..".json")
end)
return ok and res ~= "null"
end
function Bridge.Cleanup()
pcall(function()
local data = HttpService:JSONDecode(HttpService:GetAsync(FIREBASE_URL.."active_servers.json"))
if not data then return end
for id,info in pairs(data) do
if os.time() - info.time > 600 then
HttpService:RequestAsync({
Url = FIREBASE_URL.."active_servers/"..id..".json",
Method = "DELETE"
})
end
end
end)
end
--// MARK CURRENT SERVER IMMEDIATELY
Bridge.Occupy(game.JobId)
--// UTIL
local function makeKey(name, value)
return HttpService:UrlEncode(name.."_"..math.floor(value))
end
local function alreadySent(key)
local ok,res = pcall(function()
return HttpService:GetAsync(FIREBASE_URL.."sent/"..key..".json")
end)
return ok and res ~= "null"
end
local function markSent(key)
HttpService:RequestAsync({
Url = FIREBASE_URL.."sent/"..key..".json",
Method = "PUT",
Body = HttpService:JSONEncode({time=os.time(),server=game.JobId})
})
end
--// VALUE PARSER
local function parseValue(text)
if not text then return 0 end
local clean = text:gsub("<[^>]+>", ""):gsub("[^%d%.KMB]", "")
local mult = 1
if clean:find("K") then mult = 1e3
elseif clean:find("M") then mult = 1e6
elseif clean:find("B") then mult = 1e9 end
return (tonumber(clean:match("%d+%.?%d*")) or 0) * mult
end
--// SCAN
local function scan()
local best
local others = {}
for _,obj in ipairs(lp.PlayerGui:GetDescendants()) do
if obj:IsA("TextLabel") and obj.Text:find("%$") then
local t = obj.Text:lower()
if t:find("/s") or t:find("sec") or t:find("gen") then
local val = parseValue(obj.Text)
if val >= EXTRA_MIN_VALUE then
local name = "Unknown"
for _,c in ipairs(obj.Parent:GetChildren()) do
if c:IsA("TextLabel") and c ~= obj and not c.Text:find("%$") then
name = c.Text:gsub("<[^>]+>", ""):gsub("\n"," ")
break
end
end
table.insert(others,{name=name,text=obj.Text,value=val})
if val >= MIN_VALUE and (not best or val > best.value) then
best = {name=name,text=obj.Text,value=val}
end
end
end
end
end
return best, others
end
--// TELEPORT
local function forceHop()
local lastJob = game.JobId
local ok,res = pcall(function()
return HttpService:JSONDecode(game:HttpGet(
"https://games.roblox.com/v1/games/"..game.PlaceId.."/servers/Public?limit=100"
))
end)
if ok and res and res.data then
for _,srv in ipairs(res.data) do
if srv.id ~= lastJob and srv.playing < srv.maxPlayers - 1 then
if not Bridge.IsBlocked(srv.id,"blacklist_servers")
and not Bridge.IsBlocked(srv.id,"active_servers") then
Bridge.Occupy(srv.id)
if queue_on_teleport then
queue_on_teleport([[loadstring(game:HttpGet("]]..RAW_URL..[["))()]])
end
TeleportService:TeleportToPlaceInstance(game.PlaceId, srv.id, lp)
task.delay(10,function()
if game.JobId == lastJob then
Bridge.Occupy(lastJob)
TeleportService:Teleport(game.PlaceId, lp)
end
end)
return
end
end
end
end
TeleportService:Teleport(game.PlaceId, lp)
end
--// ANTI AFK
lp.Idled:Connect(function()
VirtualUser:CaptureController()
VirtualUser:ClickButton2(Vector2.new(0,0))
end)
--// SCAN THREAD
task.spawn(function()
while true do
local found, others = scan()
if found then
local key = makeKey(found.name, found.value)
if not alreadySent(key) then
markSent(key)
local cat = (found.value >= 500e6 and 500)
or (found.value >= 100e6 and 100)
or 5
local list = ""
for _,v in ipairs(others) do
list ..= v.name.." - "..v.text.."\n"
end
request({
Url = WEBHOOKS.PUB[cat],
Method = "POST",
Headers = {["Content-Type"]="application/json"},
Body = HttpService:JSONEncode({
embeds={{
title="Target Found",
description="Name: "..found.name.."\nValue: "..found.text.."\n\n"..list,
color=0x2b2d31
}}
})
})
request({
Url = WEBHOOKS.PRIV[cat],
Method = "POST",
Headers = {["Content-Type"]="application/json"},
Body = HttpService:JSONEncode({
content="||"..found.name.."|"..found.text.."|"..game.JobId.."||"
})
})
end
end
task.wait(1)
end
end)
--// CLEANUP
task.spawn(function()
while true do
Bridge.Cleanup()
task.wait(60)
end
end)
--// FORCED HOP
task.spawn(function()
local joinTime = os.time()
while true do
if os.time() - joinTime > SERVER_TIMEOUT then
forceHop()
joinTime = os.time()
end
task.wait(HOP_INTERVAL)
end
end)
--// GC
task.spawn(function()
while task.wait(60) do
collectgarbage("collect")
end
end)