local Rayfield = loadstring(game:HttpGet("https://sirius.menu/gen2"))() local Players = game:GetService("Players") local LocalPlayer = Players.LocalPlayer local BAG_COLORS = { Common = Color3.fromRGB(208, 86, 86), Uncommon = Color3.new(0, 1, 0), Rare = Color3.new(0.5, 0, 1), Epic = Color3.new(0, 1, 1), Legendary = Color3.new(0.992157, 1, 0.415686), Ultimate = Color3.new(1, 0, 0), Limited = Color3.new(1, 0, 0.815686), Halloween = Color3.new(1, 0.5, 0), Christmas = Color3.new(0, 1, 0.5), Resplendent = Color3.new(1, 1, 1), Animated = Color3.new(0.419608, 0.419608, 0.419608), } local RARITY_ORDER = { "Common", "Uncommon", "Rare", "Epic", "Legendary", "Ultimate", "Resplendent", "Limited", "Halloween", "Christmas", "Animated", } local found = {} local counts = {} for _, r in ipairs(RARITY_ORDER) do found[r] = { parts = {} } counts[r] = 0 end local scanBags local refreshButtonNames local function matchRarity(color) local best, bestDist = nil, 1e9 for r, c in pairs(BAG_COLORS) do local d = (color.R - c.R) ^ 2 + (color.G - c.G) ^ 2 + (color.B - c.B) ^ 2 if d < bestDist then bestDist = d; best = r end end return bestDist < 0.006 and best or nil end local function isBagPart(part) if not part:IsA("UnionOperation") then return false end if part.Name ~= "Main" then return false end if not part.Anchored then return false end if math.abs(part.Size.X - 2.1) > 0.05 then return false end if math.abs(part.Size.Z - 2.1) > 0.05 then return false end return true end local window = Rayfield:CreateWindow({ name = "Parkour Stealth Hub", subtitle = "Teleporte discreto + bags", configuration = { autoSave = true, autoLoad = true, fileName = "ParkourStealthHub", }, }) local bagsTab = window:CreateTab({ name = "Bags", icon = 93364949241311 }) local tpTab = window:CreateTab({ name = "Teleporte", icon = 9333654999 }) local function teleportBlocked() local rs = game:FindFirstChild("ReplicatedStorage") local blocked = false local why = "" if rs and rs:FindFirstChild("DisableTeleporting") and rs.DisableTeleporting.Value then blocked = true; why = "DisableTeleporting" end local bp = LocalPlayer.Backpack if bp and bp:FindFirstChild("Attached") and bp.Attached.Value then blocked = true; why = (why == "" and "Attached (zipline/rope)") or (why .. ", Attached") end if shared and shared.InTimeTrial then blocked = true; why = (why == "" and "InTimeTrial") or (why .. ", InTimeTrial") end if rs and rs:FindFirstChild("IsRanked") and rs.IsRanked.Value then blocked = true; why = (why == "" and "Ranked") or (why .. ", Ranked") end return blocked, why end local smoothEnabled = true local STEP = 30 local STEP_DELAY = 0.03 local function smoothTeleport(targetPos) local char = LocalPlayer.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") if not hrp then return false end local start = hrp.Position local dist = (targetPos - start).Magnitude local steps = math.max(1, math.floor(dist / STEP)) for i = 1, steps do local c2 = LocalPlayer.Character if not c2 or not c2.Parent then return false end local hrp2 = c2:FindFirstChild("HumanoidRootPart") if not hrp2 then return false end local t = i / steps local pos = start:Lerp(targetPos, t) hrp2.CFrame = CFrame.new(pos) * (hrp2.CFrame - hrp2.CFrame.Position) if i < steps then task.wait(STEP_DELAY) end end return true end local function instantTeleport(targetPos) local char = LocalPlayer.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") if not hrp then return false end hrp.CFrame = CFrame.new(targetPos + Vector3.new(0, 4, 0)) return true end local function doTeleport(pos) local blocked, why = teleportBlocked() if blocked then window:Notify({ title = "Teleporte bloqueado", content = why .. " - modo discreto nao teleporta nesse estado." }) return false end if smoothEnabled then return smoothTeleport(pos + Vector3.new(0, 4, 0)) end return instantTeleport(pos) end local function randomBag(rar) local list = found[rar] and found[rar].parts or {} if #list == 0 then window:Notify({ title = rar, content = "Nenhuma bag dessa raridade encontrada agora." }) return end local pick = list[math.random(1, #list)] if doTeleport(pick.pos) then window:Notify({ title = rar, content = "Teleportado para uma bag aleatoria!" }) else window:Notify({ title = "Erro", content = "Nao foi possivel teleportar." }) end end local bagButtons = {} for _, r in ipairs(RARITY_ORDER) do bagButtons[r] = bagsTab:CreateButton({ name = r .. " (0)", description = "Teleportar para uma bag aleatoria de " .. r, callback = function() randomBag(r) end, }) end local function findButtonLabel(handle) local title = handle.title if title and type(title) == "userdata" then return title end local main = handle.main if main then local found = nil local function walk(node) if found then return end for _, c in ipairs(node:GetChildren()) do if c:IsA("TextLabel") and c.Text then found = c return end walk(c) end end walk(main) return found end return nil end local function setButtonName(handle, text) if not handle then return end if handle.name then handle.name = text end local lbl = findButtonLabel(handle) if lbl then pcall(function() lbl.Text = text end) end end refreshButtonNames = function() for _, r in ipairs(RARITY_ORDER) do local h = bagButtons[r] if h then setButtonName(h, r .. " (" .. counts[r] .. ")") end end end bagsTab:CreateButton({ name = "Escanear agora", description = "Varre o mapa por bags fisicas e atualiza as raridades", callback = function() scanBags() local total = 0 for _, r in ipairs(RARITY_ORDER) do total = total + counts[r] end window:Notify({ title = "Scan", content = total .. " bags encontradas." }) end, }) tpTab:CreateToggle({ name = "Teleporte suave (discreto)", description = "Move em passos pequenos em vez de pular (menos detectavel)", default = true, callback = function(v) smoothEnabled = v end, }) local shownSpawns = {} tpTab:CreateButton({ name = "Listar spawns", description = "Cria botoes de teleporte para todos os SpawnLocations", callback = function() local list = {} for _, v in ipairs(game.Workspace:GetDescendants()) do if v:IsA("SpawnLocation") then table.insert(list, v) end end table.sort(list, function(a, b) return a.Name < b.Name end) local created = 0 for _, s in ipairs(list) do if not shownSpawns[s.Name] then shownSpawns[s.Name] = true created = created + 1 local target = s tpTab:CreateButton({ name = "Ir para: " .. target.Name, description = "Teleportar para o spawn " .. target.Name, callback = function() doTeleport(target.Position) end, }) end end window:Notify({ title = "Spawns", content = created .. " botoes criados." }) end, }) tpTab:CreateButton({ name = "Voltar ao spawn principal", description = "Teleporta para o SpawnLocation do mapa", callback = function() local s = game.Workspace:FindFirstChild("SpawnLocation") if s then doTeleport(s.Position) else window:Notify({ title = "Erro", content = "Spawn principal nao encontrado." }) end end, }) scanBags = function() for _, r in ipairs(RARITY_ORDER) do found[r].parts = {} counts[r] = 0 end for _, v in ipairs(game.Workspace:GetDescendants()) do if isBagPart(v) then local rar = matchRarity(v.Color) if rar and found[rar] then table.insert(found[rar].parts, { part = v, pos = v.Position }) counts[rar] = counts[rar] + 1 end end end refreshButtonNames() end task.spawn(function() scanBags() while true do task.wait(3) scanBags() end end)