-- LocalScript inside StarterPlayerScripts local Players = game:GetService("Players") local UIS = game:GetService("UserInputService") local player = Players.LocalPlayer local playerGui = player:WaitForChild("PlayerGui") -- CONFIG local ROOM_NUMBER = "3" local MIN_DELAY = 0 local MAX_DELAY = 2 -- PATH FINDER if not game:IsLoaded() then game.Loaded:Wait() end local SideRooms = workspace:WaitForChild("SideRooms", 15) if not SideRooms then warn("[Beacons] SideRooms not found") return end local Room = SideRooms:WaitForChild(ROOM_NUMBER, 15) if not Room then warn("[Beacons] Room not found") return end local BEACONS_PATH = Room:WaitForChild("Beacons", 15) or Room:FindFirstChild("Beacons", true) if not BEACONS_PATH then warn("[Beacons] Beacons folder not found") return end print("[Beacons] Found:", BEACONS_PATH:GetFullName()) -- STATE local currentIndex = 1 local collected = {} local teleportDelay = 0 local function getBeacons() local list = {} for _, v in ipairs(BEACONS_PATH:GetChildren()) do if v:IsA("BasePart") and v.Name == "Part" then table.insert(list, v) end end return list end -- GUI local screenGui = Instance.new("ScreenGui") screenGui.Name = "BeaconTeleporter" screenGui.ResetOnSpawn = false screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling screenGui.Parent = playerGui local frame = Instance.new("Frame") frame.Size = UDim2.new(0, 300, 0, 210) frame.Position = UDim2.new(0.5, -150, 1, -230) frame.BackgroundColor3 = Color3.fromRGB(6, 8, 20) frame.BorderSizePixel = 0 frame.Active = true frame.Parent = screenGui Instance.new("UICorner", frame).CornerRadius = UDim.new(0, 12) local stroke = Instance.new("UIStroke", frame) stroke.Color = Color3.fromRGB(0, 210, 255) stroke.Thickness = 1.5 stroke.Transparency = 0.2 -- Header (also drag handle) local header = Instance.new("Frame") header.Size = UDim2.new(1, 0, 0, 36) header.BackgroundColor3 = Color3.fromRGB(0, 160, 210) header.BorderSizePixel = 0 header.Active = true header.Parent = frame local hc = Instance.new("UICorner", header) hc.CornerRadius = UDim.new(0, 12) local headerFix = Instance.new("Frame", header) headerFix.Size = UDim2.new(1, 0, 0, 12) headerFix.Position = UDim2.new(0, 0, 1, -12) headerFix.BackgroundColor3 = Color3.fromRGB(0, 160, 210) headerFix.BorderSizePixel = 0 local titleLabel = Instance.new("TextLabel", header) titleLabel.Size = UDim2.new(1, 0, 1, 0) titleLabel.BackgroundTransparency = 1 titleLabel.Text = "⬡ BEACON TELEPORTER" titleLabel.Font = Enum.Font.GothamBold titleLabel.TextSize = 13 titleLabel.TextColor3 = Color3.fromRGB(255, 255, 255) -- Beacon label local beaconLabel = Instance.new("TextLabel", frame) beaconLabel.Size = UDim2.new(1, -20, 0, 26) beaconLabel.Position = UDim2.new(0, 10, 0, 44) beaconLabel.BackgroundTransparency = 1 beaconLabel.Font = Enum.Font.GothamBold beaconLabel.TextSize = 15 beaconLabel.TextColor3 = Color3.fromRGB(0, 220, 255) beaconLabel.TextXAlignment = Enum.TextXAlignment.Center -- Counter local counterLabel = Instance.new("TextLabel", frame) counterLabel.Size = UDim2.new(1, 0, 0, 18) counterLabel.Position = UDim2.new(0, 0, 0, 72) counterLabel.BackgroundTransparency = 1 counterLabel.Font = Enum.Font.Gotham counterLabel.TextSize = 11 counterLabel.TextColor3 = Color3.fromRGB(120, 200, 230) counterLabel.TextXAlignment = Enum.TextXAlignment.Center -- Collected badge local collectedBadge = Instance.new("TextLabel", frame) collectedBadge.Size = UDim2.new(0, 120, 0, 20) collectedBadge.Position = UDim2.new(0.5, -60, 0, 94) collectedBadge.BackgroundColor3 = Color3.fromRGB(55, 15, 15) collectedBadge.BorderSizePixel = 0 collectedBadge.Font = Enum.Font.GothamBold collectedBadge.TextSize = 11 collectedBadge.TextColor3 = Color3.fromRGB(255, 100, 100) collectedBadge.TextXAlignment = Enum.TextXAlignment.Center collectedBadge.Text = "NOT COLLECTED" Instance.new("UICorner", collectedBadge).CornerRadius = UDim.new(0, 6) -- Nav buttons local function makeBtn(text, pos, size) local btn = Instance.new("TextButton", frame) btn.Size = size or UDim2.new(0, 38, 0, 38) btn.Position = pos btn.BackgroundColor3 = Color3.fromRGB(0, 140, 190) btn.BorderSizePixel = 0 btn.Font = Enum.Font.GothamBold btn.TextSize = 18 btn.TextColor3 = Color3.fromRGB(255, 255, 255) btn.Text = text btn.AutoButtonColor = false Instance.new("UICorner", btn).CornerRadius = UDim.new(0, 8) return btn end local prevBtn = makeBtn("◀", UDim2.new(0, 10, 0, 122)) local nextBtn = makeBtn("▶", UDim2.new(1, -48, 0, 122)) local teleBtn = makeBtn("⚡ TELEPORT", UDim2.new(0.5, -66, 0, 122), UDim2.new(0, 132, 0, 38)) teleBtn.TextSize = 13 teleBtn.BackgroundColor3 = Color3.fromRGB(0, 200, 255) teleBtn.TextColor3 = Color3.fromRGB(0, 10, 30) -- Speed label local speedTitle = Instance.new("TextLabel", frame) speedTitle.Size = UDim2.new(1, -20, 0, 16) speedTitle.Position = UDim2.new(0, 10, 0, 168) speedTitle.BackgroundTransparency = 1 speedTitle.Font = Enum.Font.Gotham speedTitle.TextSize = 11 speedTitle.TextColor3 = Color3.fromRGB(130, 190, 210) speedTitle.TextXAlignment = Enum.TextXAlignment.Left speedTitle.Text = "DELAY: instant" -- Slider local sliderTrack = Instance.new("Frame", frame) sliderTrack.Size = UDim2.new(1, -30, 0, 14) sliderTrack.Position = UDim2.new(0, 15, 0, 188) sliderTrack.BackgroundColor3 = Color3.fromRGB(30, 50, 70) sliderTrack.BorderSizePixel = 0 Instance.new("UICorner", sliderTrack).CornerRadius = UDim.new(1, 0) local sliderFill = Instance.new("Frame", sliderTrack) sliderFill.Size = UDim2.new(0, 0, 1, 0) sliderFill.BackgroundColor3 = Color3.fromRGB(0, 210, 255) sliderFill.BorderSizePixel = 0 Instance.new("UICorner", sliderFill).CornerRadius = UDim.new(1, 0) local sliderKnob = Instance.new("Frame", sliderTrack) sliderKnob.Size = UDim2.new(0, 24, 0, 24) sliderKnob.AnchorPoint = Vector2.new(0.5, 0.5) sliderKnob.Position = UDim2.new(0, 0, 0.5, 0) sliderKnob.BackgroundColor3 = Color3.fromRGB(255, 255, 255) sliderKnob.BorderSizePixel = 0 sliderKnob.ZIndex = 3 Instance.new("UICorner", sliderKnob).CornerRadius = UDim.new(1, 0) -- UI UPDATE local function updateUI() local beacons = getBeacons() if #beacons == 0 then beaconLabel.Text = "No Beacons Found" counterLabel.Text = "0 / 0" collectedBadge.Text = "—" return end if currentIndex > #beacons then currentIndex = #beacons end local beacon = beacons[currentIndex] local collectedCount = 0 for _ in pairs(collected) do collectedCount += 1 end beaconLabel.Text = "Beacon #" .. currentIndex counterLabel.Text = string.format("%d / %d • %d collected", currentIndex, #beacons, collectedCount) if collected[beacon] then collectedBadge.Text = "✔ COLLECTED" collectedBadge.BackgroundColor3 = Color3.fromRGB(15, 55, 30) collectedBadge.TextColor3 = Color3.fromRGB(80, 255, 140) else collectedBadge.Text = "NOT COLLECTED" collectedBadge.BackgroundColor3 = Color3.fromRGB(55, 15, 15) collectedBadge.TextColor3 = Color3.fromRGB(255, 100, 100) end end -- BEACON RESPAWN DETECTION BEACONS_PATH.ChildAdded:Connect(function(child) if child:IsA("BasePart") and child.Name == "Part" then -- Clear collected status for respawned beacons collected[child] = nil updateUI() end end) BEACONS_PATH.ChildRemoved:Connect(function() updateUI() end) -- NAV BUTTONS prevBtn.Activated:Connect(function() local beacons = getBeacons() if #beacons == 0 then return end currentIndex = currentIndex - 1 if currentIndex < 1 then currentIndex = #beacons end updateUI() end) nextBtn.Activated:Connect(function() local beacons = getBeacons() if #beacons == 0 then return end currentIndex = currentIndex + 1 if currentIndex > #beacons then currentIndex = 1 end updateUI() end) -- TELEPORT teleBtn.Activated:Connect(function() local beacons = getBeacons() if #beacons == 0 then return end local beacon = beacons[currentIndex] if not beacon or not beacon.Parent then return end local char = player.Character if not char then return end local hrp = char:FindFirstChild("HumanoidRootPart") if not hrp then return end teleBtn.Text = "⏳ WARPING..." teleBtn.BackgroundColor3 = Color3.fromRGB(255, 180, 0) if teleportDelay > 0 then task.wait(teleportDelay) end hrp.CFrame = CFrame.new(beacon.Position + Vector3.new(0, 3, 0)) collected[beacon] = true updateUI() teleBtn.Text = "✔ ARRIVED" teleBtn.BackgroundColor3 = Color3.fromRGB(0, 200, 100) task.wait(1) teleBtn.Text = "⚡ TELEPORT" teleBtn.BackgroundColor3 = Color3.fromRGB(0, 200, 255) end) -- SLIDER (MOBILE TOUCH) local dragging = false local function updateSlider(inputX) local rel = math.clamp((inputX - sliderTrack.AbsolutePosition.X) / sliderTrack.AbsoluteSize.X, 0, 1) teleportDelay = MIN_DELAY + rel * (MAX_DELAY - MIN_DELAY) sliderFill.Size = UDim2.new(rel, 0, 1, 0) sliderKnob.Position = UDim2.new(rel, 0, 0.5, 0) speedTitle.Text = teleportDelay < 0.05 and "DELAY: instant" or string.format("DELAY: %.1fs", teleportDelay) end sliderKnob.InputBegan:Connect(function(i) if i.UserInputType == Enum.UserInputType.Touch then dragging = true end end) sliderTrack.InputBegan:Connect(function(i) if i.UserInputType == Enum.UserInputType.Touch then dragging = true updateSlider(i.Position.X) end end) UIS.InputChanged:Connect(function(i) if dragging and i.UserInputType == Enum.UserInputType.Touch then updateSlider(i.Position.X) end end) UIS.InputEnded:Connect(function(i) if i.UserInputType == Enum.UserInputType.Touch then dragging = false end end) -- DRAGGING (MOBILE) local dragStart, frameStart local isDragging = false header.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch then isDragging = true dragStart = input.Position frameStart = frame.Position end end) UIS.InputChanged:Connect(function(input) if isDragging and input.UserInputType == Enum.UserInputType.Touch then local delta = input.Position - dragStart frame.Position = UDim2.new( frameStart.X.Scale, frameStart.X.Offset + delta.X, frameStart.Y.Scale, frameStart.Y.Offset + delta.Y ) end end) UIS.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch then isDragging = false end end) -- INIT updateUI() if #getBeacons() == 0 then warn("[Beacons] No Parts named 'Part' found inside Beacons folder.") end