--[[ Waypoint System + Notification System v4 - Исправлена кнопка сворачивания/разворачивания - Работающее перетаскивание - Компактное окно ]] local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local CoreGui = game:GetService("CoreGui") local TweenService = game:GetService("TweenService") local player = Players.LocalPlayer -- ============================================================ -- 1. NOTIFICATION SYSTEM -- ============================================================ local NotificationSystem = {} local notifScreenGui = Instance.new("ScreenGui") notifScreenGui.Name = "NotificationSystem" notifScreenGui.Parent = CoreGui local notifHolder = Instance.new("Frame") notifHolder.Size = UDim2.new(0, 260, 1, 0) notifHolder.Position = UDim2.new(1, -270, 0, 0) notifHolder.BackgroundTransparency = 1 notifHolder.Parent = notifScreenGui local notifLayout = Instance.new("UIListLayout") notifLayout.SortOrder = Enum.SortOrder.LayoutOrder notifLayout.Padding = UDim.new(0, 6) notifLayout.VerticalAlignment = Enum.VerticalAlignment.Top notifLayout.Parent = notifHolder local notifPadding = Instance.new("UIPadding") notifPadding.PaddingTop = UDim.new(0, 10) notifPadding.Parent = notifHolder local notifOrder = 0 function NotificationSystem.notify(title, message, color, duration) color = color or Color3.fromRGB(0, 130, 255) duration = duration or 3 notifOrder = notifOrder + 1 local notif = Instance.new("Frame") notif.Size = UDim2.new(1, -10, 0, 50) notif.BackgroundColor3 = Color3.fromRGB(20, 20, 20) notif.BackgroundTransparency = 0.1 notif.BorderSizePixel = 0 notif.LayoutOrder = notifOrder notif.Parent = notifHolder local corner = Instance.new("UICorner") corner.CornerRadius = UDim.new(0, 10) corner.Parent = notif local accent = Instance.new("Frame") accent.Size = UDim2.new(0, 4, 1, -10) accent.Position = UDim2.new(0, 5, 0, 5) accent.BackgroundColor3 = color accent.BorderSizePixel = 0 accent.Parent = notif local accentCorner = Instance.new("UICorner") accentCorner.CornerRadius = UDim.new(1, 0) accentCorner.Parent = accent local titleLabel = Instance.new("TextLabel") titleLabel.Size = UDim2.new(1, -25, 0, 20) titleLabel.Position = UDim2.new(0, 18, 0, 5) titleLabel.Text = title titleLabel.TextColor3 = Color3.fromRGB(255, 255, 255) titleLabel.BackgroundTransparency = 1 titleLabel.Font = Enum.Font.GothamBold titleLabel.TextSize = 13 titleLabel.TextXAlignment = Enum.TextXAlignment.Left titleLabel.Parent = notif local msgLabel = Instance.new("TextLabel") msgLabel.Size = UDim2.new(1, -25, 0, 20) msgLabel.Position = UDim2.new(0, 18, 0, 25) msgLabel.Text = message msgLabel.TextColor3 = Color3.fromRGB(180, 180, 180) msgLabel.BackgroundTransparency = 1 msgLabel.Font = Enum.Font.Gotham msgLabel.TextSize = 11 msgLabel.TextXAlignment = Enum.TextXAlignment.Left msgLabel.TextWrapped = true msgLabel.Parent = notif notif.Position = UDim2.new(1, 280, 0, 0) TweenService:Create(notif, TweenInfo.new(0.35, Enum.EasingStyle.Quint, Enum.EasingDirection.Out), { Position = UDim2.new(0, 0, 0, 0) }):Play() task.delay(duration, function() local out = TweenService:Create(notif, TweenInfo.new(0.35, Enum.EasingStyle.Quint, Enum.EasingDirection.In), { Position = UDim2.new(1, 280, 0, 0) }) out:Play() out.Completed:Connect(function() notif:Destroy() end) end) end -- ============================================================ -- 2. WAYPOINT DATA -- ============================================================ local SAVE_FILE = "waypoints.json" local waypoints = {} local function loadWaypoints() if writefile and readfile and isfile then if isfile(SAVE_FILE) then local ok, data = pcall(function() return game:GetService("HttpService"):JSONDecode(readfile(SAVE_FILE)) end) if ok and type(data) == "table" then waypoints = data return end end end waypoints = {} end local function saveWaypoints() if writefile then pcall(function() writefile(SAVE_FILE, game:GetService("HttpService"):JSONEncode(waypoints)) end) end end loadWaypoints() -- ============================================================ -- 3. GUI -- ============================================================ local screenGui = Instance.new("ScreenGui") screenGui.Name = "WaypointSystem" screenGui.Parent = CoreGui local frame = Instance.new("Frame") frame.Size = UDim2.new(0, 260, 0, 360) frame.Position = UDim2.new(0.5, -130, 0.5, -180) frame.BackgroundColor3 = Color3.fromRGB(0, 0, 0) frame.BackgroundTransparency = 0.12 frame.BorderSizePixel = 0 frame.ClipsDescendants = true frame.Active = true frame.Parent = screenGui local frameCorner = Instance.new("UICorner") frameCorner.CornerRadius = UDim.new(0, 14) frameCorner.Parent = frame -- Заголовок local titleBar = Instance.new("Frame") titleBar.Size = UDim2.new(1, -10, 0, 32) titleBar.Position = UDim2.new(0, 5, 0, 5) titleBar.BackgroundColor3 = Color3.fromRGB(35, 35, 35) titleBar.BorderSizePixel = 0 titleBar.Active = true titleBar.Parent = frame local titleCorner = Instance.new("UICorner") titleCorner.CornerRadius = UDim.new(0, 10) titleCorner.Parent = titleBar local title = Instance.new("TextLabel") title.Size = UDim2.new(1, -75, 1, 0) title.Position = UDim2.new(0, 8, 0, 0) title.Text = "Waypoints" title.TextColor3 = Color3.fromRGB(255, 255, 255) title.BackgroundTransparency = 1 title.Font = Enum.Font.GothamBold title.TextSize = 15 title.TextXAlignment = Enum.TextXAlignment.Left title.Parent = titleBar -- Кнопка свернуть local collapseBtn = Instance.new("TextButton") collapseBtn.Size = UDim2.new(0, 28, 0, 28) collapseBtn.Position = UDim2.new(1, -62, 0, 2) collapseBtn.Text = "-" collapseBtn.BackgroundColor3 = Color3.fromRGB(70, 70, 70) collapseBtn.TextColor3 = Color3.fromRGB(255, 255, 255) collapseBtn.BorderSizePixel = 0 collapseBtn.Font = Enum.Font.GothamBold collapseBtn.TextSize = 18 collapseBtn.Parent = titleBar local collapseCorner = Instance.new("UICorner") collapseCorner.CornerRadius = UDim.new(0, 6) collapseCorner.Parent = collapseBtn -- Кнопка закрытия local closeBtn = Instance.new("TextButton") closeBtn.Size = UDim2.new(0, 28, 0, 28) closeBtn.Position = UDim2.new(1, -32, 0, 2) closeBtn.Text = "X" closeBtn.BackgroundColor3 = Color3.fromRGB(180, 40, 40) closeBtn.TextColor3 = Color3.fromRGB(255, 255, 255) closeBtn.BorderSizePixel = 0 closeBtn.Font = Enum.Font.GothamBold closeBtn.TextSize = 14 closeBtn.Parent = titleBar local closeCorner = Instance.new("UICorner") closeCorner.CornerRadius = UDim.new(0, 6) closeCorner.Parent = closeBtn -- Контейнер содержимого local contentFrame = Instance.new("Frame") contentFrame.Size = UDim2.new(1, 0, 1, -42) contentFrame.Position = UDim2.new(0, 0, 0, 42) contentFrame.BackgroundTransparency = 1 contentFrame.Parent = frame -- Поле ввода + кнопка добавить local inputBox = Instance.new("TextBox") inputBox.Size = UDim2.new(1, -100, 0, 30) inputBox.Position = UDim2.new(0, 10, 0, 3) inputBox.PlaceholderText = "Name..." inputBox.Text = "" inputBox.BackgroundColor3 = Color3.fromRGB(30, 30, 30) inputBox.TextColor3 = Color3.fromRGB(255, 255, 255) inputBox.BorderSizePixel = 0 inputBox.Font = Enum.Font.Gotham inputBox.TextSize = 12 inputBox.Parent = contentFrame local inputCorner = Instance.new("UICorner") inputCorner.CornerRadius = UDim.new(0, 8) inputCorner.Parent = inputBox local addBtn = Instance.new("TextButton") addBtn.Size = UDim2.new(0, 75, 0, 30) addBtn.Position = UDim2.new(1, -85, 0, 3) addBtn.Text = "+ Save" addBtn.BackgroundColor3 = Color3.fromRGB(0, 170, 0) addBtn.TextColor3 = Color3.fromRGB(255, 255, 255) addBtn.BorderSizePixel = 0 addBtn.Font = Enum.Font.GothamBold addBtn.TextSize = 12 addBtn.Parent = contentFrame local addCorner = Instance.new("UICorner") addCorner.CornerRadius = UDim.new(0, 8) addCorner.Parent = addBtn -- Поиск local searchBox = Instance.new("TextBox") searchBox.Size = UDim2.new(1, -20, 0, 26) searchBox.Position = UDim2.new(0, 10, 0, 43) searchBox.PlaceholderText = "Search..." searchBox.Text = "" searchBox.BackgroundColor3 = Color3.fromRGB(25, 25, 25) searchBox.TextColor3 = Color3.fromRGB(255, 255, 255) searchBox.BorderSizePixel = 0 searchBox.Font = Enum.Font.Gotham searchBox.TextSize = 12 searchBox.Parent = contentFrame local searchCorner = Instance.new("UICorner") searchCorner.CornerRadius = UDim.new(0, 8) searchCorner.Parent = searchBox -- Список local listFrame = Instance.new("ScrollingFrame") listFrame.Size = UDim2.new(1, -20, 1, -80) listFrame.Position = UDim2.new(0, 10, 0, 78) listFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 20) listFrame.BorderSizePixel = 0 listFrame.CanvasSize = UDim2.new(0, 0, 0, 0) listFrame.ScrollBarThickness = 6 listFrame.Parent = contentFrame local listCorner = Instance.new("UICorner") listCorner.CornerRadius = UDim.new(0, 8) listCorner.Parent = listFrame local listLayout = Instance.new("UIListLayout") listLayout.Padding = UDim.new(0, 5) listLayout.SortOrder = Enum.SortOrder.LayoutOrder listLayout.Parent = listFrame local listPadding = Instance.new("UIPadding") listPadding.PaddingTop = UDim.new(0, 5) listPadding.PaddingLeft = UDim.new(0, 5) listPadding.PaddingRight = UDim.new(0, 5) listPadding.Parent = listFrame -- ============================================================ -- 4. ФУНКЦИИ -- ============================================================ local renderList local function teleportTo(pos) local char = player.Character if not char then NotificationSystem.notify("Error", "Character not found", Color3.fromRGB(255, 80, 80)) return end local hrp = char:FindFirstChild("HumanoidRootPart") if not hrp then NotificationSystem.notify("Error", "No HumanoidRootPart", Color3.fromRGB(255, 80, 80)) return end hrp.CFrame = CFrame.new(pos.x, pos.y, pos.z) end local function getPlayerPosition() local char = player.Character if not char then return nil end local hrp = char:FindFirstChild("HumanoidRootPart") if not hrp then return nil end local p = hrp.Position return {x = p.X, y = p.Y, z = p.Z} end local function deleteWaypoint(index) local wp = waypoints[index] if not wp then return end table.remove(waypoints, index) saveWaypoints() NotificationSystem.notify("Deleted", "Waypoint removed", Color3.fromRGB(255, 100, 100)) renderList(searchBox.Text) end renderList = function(filter) filter = filter and filter:lower() or "" for _, child in pairs(listFrame:GetChildren()) do if child:IsA("Frame") or child:IsA("TextButton") or child:IsA("TextLabel") then child:Destroy() end end local count = 0 for i, wp in ipairs(waypoints) do if filter == "" or wp.name:lower():find(filter, 1, true) then count = count + 1 local row = Instance.new("Frame") row.Size = UDim2.new(1, -10, 0, 34) row.BackgroundColor3 = Color3.fromRGB(35, 35, 35) row.BorderSizePixel = 0 row.LayoutOrder = i row.Parent = listFrame local rowCorner = Instance.new("UICorner") rowCorner.CornerRadius = UDim.new(0, 6) rowCorner.Parent = row local nameBtn = Instance.new("TextButton") nameBtn.Size = UDim2.new(1, -80, 1, 0) nameBtn.Position = UDim2.new(0, 0, 0, 0) nameBtn.Text = " " .. wp.name nameBtn.TextColor3 = Color3.fromRGB(255, 255, 255) nameBtn.BackgroundTransparency = 1 nameBtn.Font = Enum.Font.GothamBold nameBtn.TextSize = 12 nameBtn.TextXAlignment = Enum.TextXAlignment.Left nameBtn.Parent = row nameBtn.MouseButton1Click:Connect(function() teleportTo(wp) NotificationSystem.notify("Teleport", "Moved to " .. wp.name, Color3.fromRGB(0, 200, 255), 2) end) local delBtn = Instance.new("TextButton") delBtn.Size = UDim2.new(0, 28, 0, 28) delBtn.Position = UDim2.new(1, -60, 0, 3) delBtn.Text = "X" delBtn.BackgroundColor3 = Color3.fromRGB(150, 40, 40) delBtn.TextColor3 = Color3.fromRGB(255, 255, 255) delBtn.BorderSizePixel = 0 delBtn.Font = Enum.Font.GothamBold delBtn.TextSize = 13 delBtn.Parent = row local delCorner = Instance.new("UICorner") delCorner.CornerRadius = UDim.new(0, 6) delCorner.Parent = delBtn delBtn.MouseButton1Click:Connect(function() deleteWaypoint(i) end) local renBtn = Instance.new("TextButton") renBtn.Size = UDim2.new(0, 28, 0, 28) renBtn.Position = UDim2.new(1, -30, 0, 3) renBtn.Text = "E" renBtn.BackgroundColor3 = Color3.fromRGB(60, 60, 60) renBtn.TextColor3 = Color3.fromRGB(255, 255, 255) renBtn.BorderSizePixel = 0 renBtn.Font = Enum.Font.GothamBold renBtn.TextSize = 13 renBtn.Parent = row local renCorner = Instance.new("UICorner") renCorner.CornerRadius = UDim.new(0, 6) renCorner.Parent = renBtn renBtn.MouseButton1Click:Connect(function() inputBox.Text = wp.name inputBox:CaptureFocus() local conn conn = addBtn.MouseButton1Click:Connect(function() if inputBox.Text ~= "" then waypoints[i].name = inputBox.Text saveWaypoints() NotificationSystem.notify("Renamed", "New name: " .. inputBox.Text, Color3.fromRGB(0, 200, 255)) end inputBox.Text = "" renderList(searchBox.Text) conn:Disconnect() end) end) end end if count == 0 then local empty = Instance.new("TextLabel") empty.Size = UDim2.new(1, -10, 0, 30) empty.BackgroundTransparency = 1 empty.Text = "No waypoints. Add one!" empty.TextColor3 = Color3.fromRGB(120, 120, 120) empty.Font = Enum.Font.Gotham empty.TextSize = 12 empty.Parent = listFrame end listFrame.CanvasSize = UDim2.new(0, 0, 0, listLayout.AbsoluteContentSize.Y + 12) end addBtn.MouseButton1Click:Connect(function() local name = inputBox.Text if name == "" then NotificationSystem.notify("Error", "Enter a name", Color3.fromRGB(255, 200, 0)) return end local pos = getPlayerPosition() if not pos then NotificationSystem.notify("Error", "Can't get position", Color3.fromRGB(255, 80, 80)) return end table.insert(waypoints, {name = name, x = pos.x, y = pos.y, z = pos.z}) saveWaypoints() inputBox.Text = "" renderList(searchBox.Text) NotificationSystem.notify("Saved", "Waypoint added", Color3.fromRGB(0, 200, 0)) end) searchBox:GetPropertyChangedSignal("Text"):Connect(function() renderList(searchBox.Text) end) -- ============================================================ -- 5. СВОРАЧИВАНИЕ / РАЗВОРАЧИВАНИЕ (исправлено) -- ============================================================ local isCollapsed = false local FULL_HEIGHT = 360 local COLLAPSED_HEIGHT = 42 local lastToggle = 0 local function toggleCollapse() -- Защита от двойного срабатывания (MouseButton1Click + TouchTap) if tick() - lastToggle < 0.3 then return end lastToggle = tick() isCollapsed = not isCollapsed if isCollapsed then collapseBtn.Text = "+" contentFrame.Visible = false frame.Size = UDim2.new(0, 260, 0, COLLAPSED_HEIGHT) else collapseBtn.Text = "-" contentFrame.Visible = true frame.Size = UDim2.new(0, 260, 0, FULL_HEIGHT) end end -- Только один обработчик (работает и для мыши, и для касаний) collapseBtn.MouseButton1Click:Connect(toggleCollapse) -- TouchTap НЕ подключаем, чтобы избежать двойного срабатывания -- Закрытие closeBtn.MouseButton1Click:Connect(function() screenGui:Destroy() end) -- ============================================================ -- 6. ПЕРЕТАСКИВАНИЕ -- ============================================================ local isDragging = false local dragStart, startPos local function startDrag(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then isDragging = true dragStart = input.Position startPos = frame.Position end end local function updateDrag(input) if not isDragging then return end if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then local delta = input.Position - dragStart frame.Position = UDim2.new( startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y ) end end local function endDrag(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then isDragging = false end end titleBar.InputBegan:Connect(startDrag) titleBar.InputChanged:Connect(updateDrag) titleBar.InputEnded:Connect(endDrag) UserInputService.InputChanged:Connect(function(input, gameProcessed) if gameProcessed then return end if isDragging then updateDrag(input) end end) UserInputService.InputEnded:Connect(function(input, gameProcessed) if gameProcessed then return end endDrag(input) end) -- ============================================================ -- 7. СТАРТ -- ============================================================ renderList("") NotificationSystem.notify("Waypoints", "Loaded. Total: " .. #waypoints, Color3.fromRGB(0, 130, 255)) print("[Waypoints v4] Loaded. Total: " .. #waypoints)