local Players = game:GetService("Players") local UIS = game:GetService("UserInputService") local CoreGui = game:GetService("CoreGui") local TweenService = game:GetService("TweenService") local RunService = game:GetService("RunService") local player = Players.LocalPlayer -- --- SISTEMA ANTI-DUPLICADOS: DESTRUYE CUALQUIER GUI ANTERIOR --- local oldGui = CoreGui:FindFirstChild("ModernPositionSaver") if oldGui then oldGui:Destroy() end -- --- CREACIÓN DE LA NUEVA INTERFAZ (Proporción 16:9 -> 640x360) --- local sg = Instance.new("ScreenGui") sg.Name = "ModernPositionSaver" sg.ResetOnSpawn = false sg.Parent = CoreGui -- Panel Principal Oscuro local main = Instance.new("Frame") main.Size = UDim2.new(0, 640, 0, 360) -- Proporción 16:9 main.Position = UDim2.new(0.5, -320, 0.5, -180) main.BackgroundColor3 = Color3.fromRGB(25, 25, 30) main.BorderSizePixel = 0 main.ClipsDescendants = true main.Active = true main.Parent = sg local mainCorner = Instance.new("UICorner") mainCorner.CornerRadius = UDim.new(0, 12) mainCorner.Parent = main local mainStroke = Instance.new("UIStroke") mainStroke.Color = Color3.fromRGB(60, 60, 70) mainStroke.Thickness = 1 mainStroke.Parent = main -- Barra Superior (Título) local titleBar = Instance.new("Frame") titleBar.Size = UDim2.new(1, 0, 0, 40) titleBar.BackgroundTransparency = 1 titleBar.Parent = main local title = Instance.new("TextLabel") title.Size = UDim2.new(1, -80, 1, 0) title.Position = UDim2.new(0, 15, 0, 0) title.Text = "Teleporter to the place" title.TextColor3 = Color3.fromRGB(240, 240, 240) title.TextSize = 16 title.Font = Enum.Font.GothamBold title.TextXAlignment = Enum.TextXAlignment.Left title.BackgroundTransparency = 1 title.Parent = titleBar -- Botón de Minimizar (—) local minimizeBtn = Instance.new("TextButton") minimizeBtn.Size = UDim2.new(0, 30, 0, 30) minimizeBtn.Position = UDim2.new(1, -70, 0, 5) minimizeBtn.BackgroundTransparency = 1 minimizeBtn.Text = "—" minimizeBtn.TextColor3 = Color3.fromRGB(150, 150, 160) minimizeBtn.TextSize = 16 minimizeBtn.Font = Enum.Font.GothamBold minimizeBtn.Parent = titleBar -- Botón de Cerrar Ventana (✕) local closeBtn = Instance.new("TextButton") closeBtn.Size = UDim2.new(0, 30, 0, 30) closeBtn.Position = UDim2.new(1, -35, 0, 5) closeBtn.BackgroundTransparency = 1 closeBtn.Text = "✕" closeBtn.TextColor3 = Color3.fromRGB(150, 150, 160) closeBtn.TextSize = 16 closeBtn.Font = Enum.Font.GothamBold closeBtn.Parent = titleBar -- --- CONTENEDOR CON BARRA DE DESPLAZAMIENTO (SCROLLINGFRAME) --- local scrollFrame = Instance.new("ScrollingFrame") scrollFrame.Size = UDim2.new(1, -20, 1, -50) scrollFrame.Position = UDim2.new(0, 10, 0, 45) scrollFrame.BackgroundTransparency = 1 scrollFrame.BorderSizePixel = 0 scrollFrame.ScrollBarThickness = 8 scrollFrame.ScrollBarImageColor3 = Color3.fromRGB(90, 90, 105) scrollFrame.Parent = main -- LÓGICA DE MINIMIZAR / MAXIMIZAR local isMinimized = false minimizeBtn.MouseButton1Click:Connect(function() isMinimized = not isMinimized local targetSize = isMinimized and UDim2.new(0, 640, 0, 40) or UDim2.new(0, 640, 0, 360) scrollFrame.Visible = not isMinimized TweenService:Create(main, TweenInfo.new(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Size = targetSize}):Play() end) -- Cuadrícula organizada en 3 Columnas/Hileras local gridLayout = Instance.new("UIGridLayout") gridLayout.CellSize = UDim2.new(0, 192, 0, 50) gridLayout.CellPadding = UDim2.new(0, 10, 0, 10) gridLayout.FillDirectionMaxCells = 3 -- 3 columnas por hilera gridLayout.Parent = scrollFrame -- Ajuste automático de la barra desplegable gridLayout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function() scrollFrame.CanvasSize = UDim2.new(0, 0, 0, gridLayout.AbsoluteContentSize.Y + 15) end) -- Tabla de almacenamiento de posiciones local savedPositions = {} -- --- FUNCIÓN PARA CREAR CADA SLOT CON SUS BOTONES --- local function createSlot(id) local slotFrame = Instance.new("Frame") slotFrame.BackgroundColor3 = Color3.fromRGB(35, 35, 42) slotFrame.BorderSizePixel = 0 slotFrame.Parent = scrollFrame local slotCorner = Instance.new("UICorner") slotCorner.CornerRadius = UDim.new(0, 8) slotCorner.Parent = slotFrame -- 1. BOTÓN GUARDAR local saveBtn = Instance.new("TextButton") saveBtn.Size = UDim2.new(0, 78, 1, 0) saveBtn.Position = UDim2.new(0, 0, 0, 0) saveBtn.BackgroundColor3 = Color3.fromRGB(45, 120, 240) saveBtn.Text = "P" .. id .. " Guardar" saveBtn.TextColor3 = Color3.fromRGB(255, 255, 255) saveBtn.Font = Enum.Font.GothamMedium saveBtn.TextSize = 11 saveBtn.BorderSizePixel = 0 saveBtn.Parent = slotFrame local saveCorner = Instance.new("UICorner") saveCorner.CornerRadius = UDim.new(0, 8) saveCorner.Parent = saveBtn -- 2. BOTÓN VIAJAR (FLOTANDO) local tpBtn = Instance.new("TextButton") tpBtn.Size = UDim2.new(0, 82, 1, 0) tpBtn.Position = UDim2.new(0, 82, 0, 0) tpBtn.BackgroundColor3 = Color3.fromRGB(40, 170, 90) tpBtn.Text = "Viajar ☁️" tpBtn.TextColor3 = Color3.fromRGB(255, 255, 255) tpBtn.Font = Enum.Font.GothamBold tpBtn.TextSize = 11 tpBtn.BorderSizePixel = 0 tpBtn.Parent = slotFrame local tpCorner = Instance.new("UICorner") tpCorner.CornerRadius = UDim.new(0, 8) tpCorner.Parent = tpBtn -- 3. BOTÓN BORRAR (✕) local deleteBtn = Instance.new("TextButton") deleteBtn.Size = UDim2.new(0, 24, 1, 0) deleteBtn.Position = UDim2.new(1, -24, 0, 0) deleteBtn.BackgroundTransparency = 1 deleteBtn.Text = "✕" deleteBtn.TextColor3 = Color3.fromRGB(200, 80, 80) deleteBtn.Font = Enum.Font.GothamBold deleteBtn.TextSize = 13 deleteBtn.Parent = slotFrame -- LÓGICA: GUARDAR saveBtn.MouseButton1Click:Connect(function() local char = player.Character if char and char:FindFirstChild("HumanoidRootPart") then savedPositions[id] = char.HumanoidRootPart.CFrame saveBtn.Text = "¡Guardado! ✓" task.wait(1) saveBtn.Text = "P" .. id .. " Guardar" end end) -- LÓGICA: VIAJAR (FLOTANDO Y SIN BUGS) tpBtn.MouseButton1Click:Connect(function() local char = player.Character if not savedPositions[id] then tpBtn.Text = "¡Sin Posición!" task.wait(1) tpBtn.Text = "Viajar ☁️" return end if char and char:FindFirstChild("HumanoidRootPart") then local hrp = char.HumanoidRootPart task.spawn(function() tpBtn.Text = "¡Volando...!" -- Detener inercia hrp.AssemblyLinearVelocity = Vector3.zero hrp.AssemblyAngularVelocity = Vector3.zero -- Elevar un poco (+3 bloques) local startCFrame = hrp.CFrame + Vector3.new(0, 3, 0) local targetCFrame = savedPositions[id] + Vector3.new(0, 3, 0) hrp.CFrame = startCFrame -- Fuerza Antigravedad local bodyVel = Instance.new("BodyVelocity") bodyVel.Name = "AntiBugFloat" bodyVel.Velocity = Vector3.zero bodyVel.MaxForce = Vector3.new(math.huge, math.huge, math.huge) bodyVel.Parent = hrp -- Noclip durante el viaje para atravesar paredes local noclipConn = RunService.Stepped:Connect(function() for _, part in ipairs(char:GetDescendants()) do if part:IsA("BasePart") then part.CanCollide = false end end end) -- Cálculo de tiempo proporcional a distancia local distance = (targetCFrame.Position - startCFrame.Position).Magnitude local travelTime = math.clamp(distance / 80, 0.8, 4) local tween = TweenService:Create(hrp, TweenInfo.new(travelTime, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut), {CFrame = targetCFrame}) tween:Play() tween.Completed:Wait() -- Aterrizar suavemente local landTween = TweenService:Create(hrp, TweenInfo.new(0.4, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {CFrame = savedPositions[id]}) landTween:Play() landTween.Completed:Wait() -- Limpieza de física noclipConn:Disconnect() bodyVel:Destroy() hrp.AssemblyLinearVelocity = Vector3.zero tpBtn.Text = "¡Llegaste! ✓" task.wait(1) tpBtn.Text = "Viajar ☁️" end) end end) -- LÓGICA: BORRAR deleteBtn.MouseButton1Click:Connect(function() if savedPositions[id] then savedPositions[id] = nil tpBtn.Text = "Borrado ✕" task.wait(1) tpBtn.Text = "Viajar ☁️" end end) end -- Generar los 15 Slots for i = 1, 15 do createSlot(i) end -- --- ARRASTRE DE VENTANA (DRAG) --- local dragging, dragInput, dragStart, startPos local function update(input) local delta = input.Position - dragStart main.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y) end titleBar.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true ; dragStart = input.Position ; startPos = main.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) end end) titleBar.InputChanged:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then dragInput = input end end) UIS.InputChanged:Connect(function(input) if input == dragInput and dragging then update(input) end end) closeBtn.MouseButton1Click:Connect(function() sg:Destroy() end) -- Tecla X para alternar visibilidad UIS.InputBegan:Connect(function(input, gpe) if input.KeyCode == Enum.KeyCode.X and not gpe then main.Visible = not main.Visible end end)