local Players = game:GetService("Players") local RunService = game:GetService("RunService") local TweenService = game:GetService("TweenService") local workspace = game:GetService("Workspace") local player = Players.LocalPlayer local character = player.Character or player.CharacterAdded:Wait() local humanoid = character:WaitForChild("Humanoid") local humanoidRootPart = character:WaitForChild("HumanoidRootPart") local STAGE_PREFIX = "" local MAX_STAGES = 1000 local TELEPORT_DELAY = 0.2 local TELEPORT_OFFSET = Vector3.new(0, 5, 0) local USE_SMOOTH_TELEPORT = false local originalPosition = humanoidRootPart.CFrame local originalCollisionStates = {} local function findStage(stageNumber) local stageName = STAGE_PREFIX .. tostring(stageNumber) return workspace.Stages:FindFirstChild(stageName) end local function disableCollision(part) if part:IsA("BasePart") then originalCollisionStates[part] = part.CanCollide part.CanCollide = false end for _, child in pairs(part:GetChildren()) do disableCollision(child) end end local function restoreCollision(part) if part:IsA("BasePart") and originalCollisionStates[part] ~= nil then part.CanCollide = originalCollisionStates[part] originalCollisionStates[part] = nil end for _, child in pairs(part:GetChildren()) do restoreCollision(child) end end local function findTouchInterestAndPosition(stage) local function searchForTouchInterest(obj) local touchInterest = obj:FindFirstChild("TouchInterest") if touchInterest and obj:IsA("BasePart") then return obj, touchInterest end for _, child in pairs(obj:GetChildren()) do local foundPart, foundTouchInterest = searchForTouchInterest(child) if foundPart and foundTouchInterest then return foundPart, foundTouchInterest end end return nil, nil end local touchPart, touchInterest = searchForTouchInterest(stage) if touchPart then local partPosition = touchPart.Position local partSize = touchPart.Size local teleportPosition = partPosition + TELEPORT_OFFSET + Vector3.new(0, partSize.Y/2, 0) return touchPart, touchInterest, CFrame.new(teleportPosition) end return nil, nil, nil end local function instantTeleport(targetCFrame) if not character or not character.Parent then return false end local humanoidRootPart = character:FindFirstChild("HumanoidRootPart") if not humanoidRootPart then return false end humanoidRootPart.CFrame = targetCFrame return true end local function smoothTeleport(targetCFrame, duration) if not character or not character.Parent then return false end local humanoidRootPart = character:FindFirstChild("HumanoidRootPart") if not humanoidRootPart then return false end duration = duration or 0.5 local tweenInfo = TweenInfo.new( duration, Enum.EasingStyle.Quad, Enum.EasingDirection.InOut, 0, false, 0 ) local tween = TweenService:Create(humanoidRootPart, tweenInfo, {CFrame = targetCFrame}) tween:Play() tween.Completed:Wait() return true end local function freezeCharacter() if humanoid then humanoid.PlatformStand = true humanoid.Sit = false humanoid.Jump = false end end local function unfreezeCharacter() if humanoid then humanoid.PlatformStand = false end end local function waitForTouch(touchPart, timeout) timeout = timeout or 1 local startTime = tick() local touched = false local connection connection = touchPart.Touched:Connect(function(hit) if hit.Parent == character then touched = true connection:Disconnect() end end) while not touched and (tick() - startTime) < timeout do wait(0.1) end connection:Disconnect() return touched end local function findWorkspaceStage(stageNumber) return workspace:FindFirstChild(tostring(stageNumber)) end local function processSingleStage(stage, stageNumber, stageType) disableCollision(stage) local touchPart, touchInterest, teleportCFrame = findTouchInterestAndPosition(stage) if touchPart and touchInterest and teleportCFrame then local teleportSuccess if USE_SMOOTH_TELEPORT then teleportSuccess = smoothTeleport(teleportCFrame, 0.3) else teleportSuccess = instantTeleport(teleportCFrame) end if teleportSuccess then wait(TELEPORT_DELAY) local touchOccurred = waitForTouch(touchPart, 0.5) return true else return false end else return false end restoreCollision(stage) end local function processAllStages() freezeCharacter() local processedStages = 0 local failedStages = 0 if workspace:FindFirstChild("Stages") then for stageNumber = 1, MAX_STAGES do local stage = findStage(stageNumber) if not stage then break end local success = processSingleStage(stage, stageNumber, "Stage") if success then processedStages = processedStages + 1 else failedStages = failedStages + 1 end restoreCollision(stage) wait(0.1) end end for stageNumber = 1, MAX_STAGES do local stage = findWorkspaceStage(stageNumber) if not stage then break end local success = processSingleStage(stage, stageNumber, "Workspace Stage") if success then processedStages = processedStages + 1 else failedStages = failedStages + 1 end restoreCollision(stage) wait(0.1) end if USE_SMOOTH_TELEPORT then smoothTeleport(originalPosition, 0.5) else instantTeleport(originalPosition) end unfreezeCharacter() end local function safeProcessAllStages() local success, error = pcall(processAllStages) if not success then for part, originalState in pairs(originalCollisionStates) do if part and part.Parent then part.CanCollide = originalState end end if humanoidRootPart and humanoidRootPart.Parent then humanoidRootPart.CFrame = originalPosition end unfreezeCharacter() end end safeProcessAllStages()