-- ServerSaver & Joiner 3000 - COMPACT EDITION (1.5x smaller) local Players = game:GetService("Players") local TeleportService = game:GetService("TeleportService") local UserInputService = game:GetService("UserInputService") local player = Players.LocalPlayer local FOLDER = "ServerJoinerOrSaverStorage" if not isfolder(FOLDER) then makefolder(FOLDER) end -- ==================== MAIN GUI (SMALLER!) ==================== local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "ServerSaver3000" ScreenGui.ResetOnSpawn = false ScreenGui.Parent = player:WaitForChild("PlayerGui") local MainFrame = Instance.new("Frame") MainFrame.Size = UDim2.new(0, 254, 0, 347) -- 1.5x smaller than before MainFrame.Position = UDim2.new(0.5, -127, 0.5, -173) MainFrame.BackgroundColor3 = Color3.fromRGB(22, 22, 33) MainFrame.ClipsDescendants = true MainFrame.Parent = ScreenGui local Corner = Instance.new("UICorner", MainFrame) Corner.CornerRadius = UDim.new(0, 14) local Stroke = Instance.new("UIStroke", MainFrame) Stroke.Color = Color3.fromRGB(255, 100, 180) Stroke.Thickness = 2.5 local Title = Instance.new("TextLabel") Title.Size = UDim2.new(1,0,0,36) Title.BackgroundTransparency = 1 Title.Text = "ServerSaver 3000" Title.TextColor3 = Color3.fromRGB(255, 120, 200) Title.Font = Enum.Font.GothamBlack Title.TextSize = 18 Title.Parent = MainFrame -- Name TextBox local NameBox = Instance.new("TextBox") NameBox.Size = UDim2.new(0.9,0,0,32) NameBox.Position = UDim2.new(0.05,0,0.12,0) NameBox.BackgroundColor3 = Color3.fromRGB(45,45,65) NameBox.PlaceholderText = "Name here.." NameBox.Text = "" NameBox.TextColor3 = Color3.new(1,1,1) NameBox.Font = Enum.Font.Gotham NameBox.TextSize = 15 local nc = Instance.new("UICorner", NameBox); nc.CornerRadius = UDim.new(0,10) NameBox.Parent = MainFrame -- Save Button local SaveBtn = Instance.new("TextButton") SaveBtn.Size = UDim2.new(0.9,0,0,36) SaveBtn.Position = UDim2.new(0.05,0,0.24,0) SaveBtn.BackgroundColor3 = Color3.fromRGB(80, 200, 100) SaveBtn.Text = "Save" SaveBtn.TextColor3 = Color3.new(1,1,1) SaveBtn.Font = Enum.Font.GothamBold SaveBtn.TextSize = 17 local sc = Instance.new("UICorner", SaveBtn); sc.CornerRadius = UDim.new(0,10) SaveBtn.Parent = MainFrame -- Toggle List Button local ToggleListBtn = Instance.new("TextButton") ToggleListBtn.Size = UDim2.new(0.9,0,0,32) ToggleListBtn.Position = UDim2.new(0.05,0,0.36,0) ToggleListBtn.BackgroundColor3 = Color3.fromRGB(100, 100, 220) ToggleListBtn.Text = "Show ▼" ToggleListBtn.TextColor3 = Color3.new(1,1,1) ToggleListBtn.Font = Enum.Font.GothamBold ToggleListBtn.TextSize = 15 local tc = Instance.new("UICorner", ToggleListBtn); tc.CornerRadius = UDim.new(0,10) ToggleListBtn.Parent = MainFrame -- Scrolling List local ScrollFrame = Instance.new("ScrollingFrame") ScrollFrame.Size = UDim2.new(0.9,0,0.38,0) ScrollFrame.Position = UDim2.new(0.05,0,0.46,0) ScrollFrame.BackgroundColor3 = Color3.fromRGB(35,35,50) ScrollFrame.BorderSizePixel = 0 ScrollFrame.ScrollBarThickness = 6 ScrollFrame.CanvasSize = UDim2.new(0,0,0,0) ScrollFrame.Visible = false local lc = Instance.new("UICorner", ScrollFrame); lc.CornerRadius = UDim.new(0,10) ScrollFrame.Parent = MainFrame local ListLayout = Instance.new("UIListLayout", ScrollFrame) ListLayout.Padding = UDim.new(0,5) ListLayout.SortOrder = Enum.SortOrder.Name -- Join & Delete Buttons local JoinBtn = Instance.new("TextButton") JoinBtn.Size = UDim2.new(0.44,0,0,38) JoinBtn.Position = UDim2.new(0.05,0,0.93,0) JoinBtn.BackgroundColor3 = Color3.fromRGB(60, 180, 255) JoinBtn.Text = "Join" JoinBtn.TextColor3 = Color3.new(1,1,1) JoinBtn.Font = Enum.Font.GothamBold JoinBtn.TextSize = 18 local jc = Instance.new("UICorner", JoinBtn); jc.CornerRadius = UDim.new(0,10) JoinBtn.Parent = MainFrame local DeleteBtn = Instance.new("TextButton") DeleteBtn.Size = UDim2.new(0.44,0,0,38) DeleteBtn.Position = UDim2.new(0.52,0,0.93,0) DeleteBtn.BackgroundColor3 = Color3.fromRGB(255, 80, 80) DeleteBtn.Text = "Delete" DeleteBtn.TextColor3 = Color3.new(1,1,1) DeleteBtn.Font = Enum.Font.GothamBold DeleteBtn.TextSize = 18 local dc = Instance.new("UICorner", DeleteBtn); dc.CornerRadius = UDim.new(0,10) DeleteBtn.Parent = MainFrame -- =============== DRAG SUPPORT =============== local function makeDraggable(frame) local dragging = false local dragInput, mousePos, framePos frame.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true mousePos = input.Position framePos = frame.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) end end) frame.InputChanged:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then dragInput = input end end) UserInputService.InputChanged:Connect(function(input) if dragging and input == dragInput then local delta = input.Position - mousePos frame.Position = UDim2.new(framePos.X.Scale, framePos.X.Offset + delta.X, framePos.Y.Scale, framePos.Y.Offset + delta.Y) end end) end makeDraggable(MainFrame) -- =============== LIST MANAGEMENT (same logic) =============== local selectedFile = nil local function refreshList() local currentSelected = selectedFile for _, child in pairs(ScrollFrame:GetChildren()) do if child:IsA("TextButton") then child:Destroy() end end local files = listfiles(FOLDER) local ySize = 0 for _, path in pairs(files) do local name = path:match("([^/]+)$") if name and not (name == "IgnoredServers" or name == "PlayerFinderToggleState" or name == "PlayerFinderTextboxName") then local btn = Instance.new("TextButton") btn.Size = UDim2.new(1,-8,0,38) btn.BackgroundColor3 = Color3.fromRGB(50,50,70) btn.Text = name btn.TextColor3 = Color3.new(1,1,1) btn.Font = Enum.Font.GothamBold btn.TextSize = 15 btn.TextXAlignment = Enum.TextXAlignment.Left btn.TextTruncate = Enum.TextTruncate.AtEnd local bc = Instance.new("UICorner", btn); bc.CornerRadius = UDim.new(0,8) local pad = Instance.new("UIPadding", btn) pad.PaddingLeft = UDim.new(0,10) if name == currentSelected then btn.BackgroundColor3 = Color3.fromRGB(120, 120, 180) selectedFile = name end btn.MouseButton1Click:Connect(function() if selectedFile == name then btn.BackgroundColor3 = Color3.fromRGB(50,50,70) selectedFile = nil else for _, b in pairs(ScrollFrame:GetChildren()) do if b:IsA("TextButton") then b.BackgroundColor3 = Color3.fromRGB(50,50,70) end end btn.BackgroundColor3 = Color3.fromRGB(120, 120, 180) selectedFile = name end end) btn.Parent = ScrollFrame ySize = ySize + 43 end end ScrollFrame.CanvasSize = UDim2.new(0,0,0,ySize) end task.spawn(function() while task.wait(0.3) do if ScrollFrame.Visible then refreshList() end end end) -- =============== BUTTONS =============== SaveBtn.MouseButton1Click:Connect(function() local name = NameBox.Text:gsub("^%s*(.-)%s*$", "%1") if name == "" or game.JobId == "" then SaveBtn.Text = "Invalid!" task.wait(1.2) SaveBtn.Text = "Save" return end writefile(FOLDER.."/"..name, game.JobId.."\n"..game.PlaceId) SaveBtn.Text = "Saved!" NameBox.Text = "" task.wait(1) SaveBtn.Text = "Save" refreshList() end) ToggleListBtn.MouseButton1Click:Connect(function() ScrollFrame.Visible = not ScrollFrame.Visible ToggleListBtn.Text = ScrollFrame.Visible and "Hide ▲" or "Show ▼" end) JoinBtn.MouseButton1Click:Connect(function() if not selectedFile then JoinBtn.Text = "Select!" task.wait(1.2) JoinBtn.Text = "Join" return end local content = readfile(FOLDER.."/"..selectedFile) local jobId = content:match("^([^\n]+)") local placeId = tonumber(content:match("\n(%d+)")) if jobId and placeId then TeleportService:TeleportToPlaceInstance(placeId, jobId, player) end end) DeleteBtn.MouseButton1Click:Connect(function() if selectedFile and isfile(FOLDER.."/"..selectedFile) then delfile(FOLDER.."/"..selectedFile) selectedFile = nil DeleteBtn.Text = "Deleted!" task.wait(1) DeleteBtn.Text = "Delete" refreshList() end end) print("ServerSaver 3000 COMPACT LOADED - Perfect size now!")