
KeylessUniversal

-- 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!")



we just be making any script atp
@ai_Abuse 🥀
the more the better
Bad script doesn't work anymore (this script is very bad and this Logs you)
I agree this doesn't work for me to This has hacked my Roblox account and Logged where I live
@Duckhub ??? what