Server Saver or Joiner
Key RequiredUniversal

Server Saver or Joiner

Universal Scriptdavidisnotafurrydavidisnotafurry 1.1K views 375 executesUpdated Nov 26, 2025
1.4/ 5(7 votes)
2529% Positive
Lua Script•250 lines (8979 chars)
-- 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!")

Features & Information

This script is made for saving server jobids and joining them however you want! Remember you cant join some type of servers being: private servers u dont have acess to, private matches ( games generated inside of another game aka matches )
#Server#serverjoiner#jobid#serversaver

Community Comments (6)

hi_hi_hihi_hi_hiNov 26, 2025

we just be making any script atp

Replying to @hi_hi_hi
davidisnotafurrydavidisnotafurryNov 26, 2025

@ai_Abuse 🥀

FIREBLOODFIREBLOODNov 26, 2025

the more the better

stopbeingnotsigmastopbeingnotsigmaNov 26, 2025

Bad script doesn't work anymore (this script is very bad and this Logs you)

DuckhubDuckhubNov 26, 2025

I agree this doesn't work for me to This has hacked my Roblox account and Logged where I live

Replying to @Duckhub
HaizZ1HaizZ1Oct 9, 2026

@Duckhub ??? what

More Scripts for Universal Scripts