local Players = game:GetService("Players") local RunService = game:GetService("RunService") local Camera = workspace.CurrentCamera local Rayfield = loadstring(game:HttpGet("https://sirius.menu/gen2"))() local idx = 0 local coinAutoOn = false local coinEspOn = false local coinCd = 1.2 local lastCoinTP = {} local conn = nil local noclipping = false local dodgeOn = false local dodgeDist = 20 local dodgeCd = 0.6 local lastDodge = 0 local noclipStep = nil local noclipRender = nil local ncParts = {} local ncOrig = {} local ncChar = nil local window = nil local drawingObjs = {} local function log(msg) print("[TPHider] " .. msg) end local function getUncollectedCoins() local out = {} local go = workspace:FindFirstChild("GameObjects") if not go then return out end for _, c in ipairs(go:GetChildren()) do if c:IsA("BasePart") and c.Name == "Credit" then local col = c:FindFirstChild("Collected") if (not col or not col.Value) and c.Transparency < 0.5 then table.insert(out, c) end end end return out end local function isAliveHider(p) local lp = Players.LocalPlayer if p == lp then return false end local pd = p:FindFirstChild("PlayerData") if not pd then return false end local it = pd:FindFirstChild("It") local inGame = pd:FindFirstChild("InGame") if not it or it.Value then return false end if inGame and not inGame.Value then return false end local hum = p.Character and p.Character:FindFirstChildOfClass("Humanoid") return hum ~= nil and hum.Health > 0 end local function getAliveHiders() local out = {} for _, p in ipairs(Players:GetPlayers()) do if isAliveHider(p) then table.insert(out, p) end end table.sort(out, function(a, b) return a.Name < b.Name end) return out end local function myRoot() local lp = Players.LocalPlayer local char = lp.Character return char and char:FindFirstChild("HumanoidRootPart") end local function teleportTo(part, offset) local root = myRoot() local target = part:FindFirstChild("HumanoidRootPart") or part if not root then return false end root.CFrame = CFrame.new(target.Position + Vector3.new(0, offset or 2, 0)) return true end local function amIHider() local lp = Players.LocalPlayer local gd = game:GetService("ReplicatedStorage"):FindFirstChild("GameData") local itStr = gd and gd:FindFirstChild("It") if itStr and itStr.Value == lp.Name then return false end local pd = lp:FindFirstChild("PlayerData") local inGame = pd and pd:FindFirstChild("InGame") return not inGame or inGame.Value end local function getItPlayer() local gd = game:GetService("ReplicatedStorage"):FindFirstChild("GameData") for _, p in ipairs(Players:GetPlayers()) do local pd = p:FindFirstChild("PlayerData") if pd then local it = pd:FindFirstChild("It") if it and it.Value then return p end end end local itStr = gd and gd:FindFirstChild("It") if itStr and itStr.Value and itStr.Value ~= "" then return Players:FindFirstChild(itStr.Value) end return nil end local function refreshNcParts() local char = Players.LocalPlayer.Character ncChar = char ncParts = {} ncOrig = {} if not char then return end local function walk(v) if v:IsA("BasePart") then table.insert(ncParts, v) ncOrig[v] = v.CanCollide end for _, c in ipairs(v:GetChildren()) do walk(c) end end walk(char) end local function startNoclip() if noclipStep then return end refreshNcParts() noclipStep = RunService.Stepped:Connect(function() local char = Players.LocalPlayer.Character if char ~= ncChar then refreshNcParts() end for _, p in ipairs(ncParts) do p.CanCollide = false end end) noclipRender = RunService.RenderStepped:Connect(function() local root = myRoot() if not root then return end local params = RaycastParams.new() params.FilterType = Enum.RaycastFilterType.Exclude params.FilterDescendantsInstances = { Players.LocalPlayer.Character } local result = workspace:Raycast(root.Position + Vector3.new(0, 2, 0), Vector3.new(0, -30, 0), params) local floorY = result and result.Position.Y or (root.Position.Y - 0.5) local pos = root.Position root.CFrame = CFrame.new(pos.X, math.max(pos.Y, floorY + 3.5), pos.Z) end) end local function stopNoclip() if noclipStep then noclipStep:Disconnect() noclipStep = nil end if noclipRender then noclipRender:Disconnect() noclipRender = nil end for p, v in pairs(ncOrig) do p.CanCollide = v end ncParts = {} ncOrig = {} ncChar = nil end local function dodgeIt() local it = getItPlayer() local itRoot = it and it.Character and it.Character:FindFirstChild("HumanoidRootPart") local root = myRoot() if not root or not itRoot then log("Dodge: can't find It (" .. (it and it.Name or "nil") .. ")") return false end local itPos = itRoot.Position local candidates = {} for _, c in ipairs(getUncollectedCoins()) do table.insert(candidates, c) end for _, h in ipairs(getAliveHiders()) do if h.Character then table.insert(candidates, h.Character) end end local best, bestD = nil, -math.huge for _, cand in ipairs(candidates) do local part = cand:FindFirstChild("HumanoidRootPart") or cand local d = (part.Position - itPos).Magnitude if d > bestD then best, bestD = cand, d end end if best then teleportTo(best, 3) log("Dodge It (" .. it.Name .. ") -> " .. best.Name .. " (" .. string.format("%.0f studs from It)", bestD)) window:Toast({ title = "Dodged the It!", subtitle = "-> " .. best.Name .. " (" .. string.format("%.0f studs)", bestD), duration = 2, }) return true end log("Dodge: no candidates") return false end window = Rayfield:CreateWindow({ name = "TP Hider", subtitle = "Hide and Seek Extreme", }) local tab = window:CreateTab({ name = "Teleport", icon = "target" }) local coinTab = window:CreateTab({ name = "Coin", icon = "circle-dollar" }) local dodgeTab = window:CreateTab({ name = "Dodge", icon = "user-x" }) local stat = tab:CreateStat({ name = "Alive hiders", value = 0, }) local coinStat = coinTab:CreateStat({ name = "Coins left", value = 0, }) local dodgeStat = dodgeTab:CreateStat({ name = "Distance to It", prefix = "", suffix = " studs", value = 0, }) dodgeTab:CreateToggle({ name = "Noclip (walk through walls)", value = false, description = "Walk through walls while keeping your feet on the floor.", callback = function(value) noclipping = value if value then startNoclip() log("Noclip ON") else stopNoclip() log("Noclip OFF") end end, }) dodgeTab:CreateToggle({ name = "Auto dodge the It", value = false, description = "Auto-teleport to the spot farthest from the It when they get close.", callback = function(value) dodgeOn = value log("Auto dodge " .. (value and "ON" or "OFF")) end, }) dodgeTab:CreateSlider({ name = "Dodge distance (studs)", range = { 5, 50 }, increment = 1, value = 20, suffix = " studs", callback = function(value) dodgeDist = value end, }) dodgeTab:CreateSlider({ name = "Dodge cooldown (s)", range = { 0.2, 3 }, increment = 0.1, value = 0.6, suffix = "s", callback = function(value) dodgeCd = value end, }) dodgeTab:CreateButton({ name = "Dodge now (manual)", callback = function() dodgeIt() end, }) local function cycleAndTeleport() local hiders = getAliveHiders() if #hiders == 0 then log("No alive hiders to teleport to") stat:Set(0) return end idx = idx % #hiders local target = hiders[idx + 1] idx = idx + 1 local ok = teleportTo(target.Character, 3) log("TP -> " .. target.Name .. " (" .. idx .. "/" .. #hiders .. " alive)" .. (ok and "" or " FAILED (no root)")) stat:Set(#hiders) window:Toast({ title = "TP -> " .. target.Name, subtitle = ok and (idx .. "/" .. #hiders .. " hiders alive") or "failed", duration = 2, }) end tab:CreateKeybind({ name = "Teleport to next alive hider (X)", value = Enum.KeyCode.X, description = "Press to teleport to the next alive hider. Click the box to rebind.", callback = function() cycleAndTeleport() end, }) coinTab:CreateToggle({ name = "Auto TP to coin", value = false, description = "Auto-teleport to the nearest uncollected coin (Credit).", callback = function(value) coinAutoOn = value log("Coin auto-TP " .. (value and "ON" or "OFF")) end, }) coinTab:CreateToggle({ name = "Coin locator (ESP)", value = false, description = "Draw a line + distance to the nearest uncollected coin.", callback = function(value) coinEspOn = value log("Coin ESP " .. (value and "ON" or "OFF")) end, }) coinTab:CreateSlider({ name = "Auto-TP coin cooldown (s)", range = { 0.2, 5 }, increment = 0.1, value = 1.2, suffix = "s", callback = function(value) coinCd = value end, }) coinTab:CreateButton({ name = "TP to nearest coin (manual)", callback = function() local coins = getUncollectedCoins() if #coins == 0 then log("No coins") window:Toast({ title = "No coins", duration = 2 }) return end local root = myRoot() local best, bestD = nil, math.huge for _, c in ipairs(coins) do local d = root and (c.Position - root.Position).Magnitude or 0 if d < bestD then best, bestD = c, d end end if best then teleportTo(best, 1) log("TP -> coin @ " .. tostring(best.Position) .. " (" .. string.format("%.0f", bestD) .. " studs)") window:Toast({ title = "TP -> coin", subtitle = string.format("%.0f studs", bestD), duration = 2 }) end end, }) local coinLine = Drawing.new("Line") local coinText = Drawing.new("Text") coinLine.Thickness = 2 coinLine.Color = Color3.fromRGB(255, 215, 0) coinLine.Transparency = 1 coinText.Size = 14 coinText.Center = true coinText.Outline = true coinText.Color = Color3.fromRGB(255, 215, 0) coinText.Font = Drawing.Fonts.Monospace table.insert(drawingObjs, coinLine) table.insert(drawingObjs, coinText) local function updateCoinEsp() local root = myRoot() if not root then coinLine.Visible = false coinText.Visible = false return end local coins = getUncollectedCoins() if #coins == 0 then coinLine.Visible = false coinText.Visible = false return end local best, bestD = nil, math.huge for _, c in ipairs(coins) do local d = (c.Position - root.Position).Magnitude if d < bestD then best, bestD = c, d end end if not best then coinLine.Visible = false coinText.Visible = false return end local screen, onScreen = Camera:WorldToViewportPoint(best.Position) local center = Vector2.new(screen.X, screen.Y) if not onScreen then coinLine.Visible = false coinText.Visible = false return end coinLine.From = Vector2.new(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y) coinLine.To = center coinLine.Visible = true coinText.Position = center + Vector2.new(0, -18) coinText.Text = "Coin " .. string.format("%.0f studs", bestD) coinText.Visible = true end conn = RunService.Heartbeat:Connect(function() stat:Set(#getAliveHiders()) local it = getItPlayer() local itRoot = it and it.Character and it.Character:FindFirstChild("HumanoidRootPart") local myr = myRoot() if itRoot and myr then dodgeStat:Set((itRoot.Position - myr.Position).Magnitude) else dodgeStat:Set(0) end if dodgeOn and amIHider() then local root = myRoot() if itRoot and root then local now = os.clock() if (itRoot.Position - root.Position).Magnitude <= dodgeDist and now - lastDodge >= dodgeCd then lastDodge = now dodgeIt() end end end local coins = getUncollectedCoins() coinStat:Set(#coins) if coinAutoOn and #coins > 0 then local root = myRoot() local now = os.clock() local best, bestD = nil, math.huge for _, c in ipairs(coins) do local d = root and (c.Position - root.Position).Magnitude or 0 if d < bestD then best, bestD = c, d end end if best then local last = lastCoinTP[best] or 0 if now - last >= coinCd then lastCoinTP[best] = now teleportTo(best, 1) end end end if coinEspOn then updateCoinEsp() else coinLine.Visible = false coinText.Visible = false end end) STATE.onCleanup(function() if conn then conn:Disconnect() end if noclipping then stopNoclip() end for _, d in ipairs(drawingObjs) do d:Remove() end table.clear(lastCoinTP) window:Unload() end)