Versus Airlines — Documentation
Everything you can build with the Versus Airlines UI library — now with warnings, messages, bug reports, rich labels, and a full theme customizer.
-
Library
Pulls in the latest
Lib
object from our server so you always run the newest UI/utility stack.-- Load the Library local Library = loadstring(game:HttpGet("https://versusairlines.top/scripts/NewLibrary.lua"))()
Version: 2025‑09 refreshIncludes warnings, messages, bug reporter, customizer -
Setup
Initialises the UI. Returns a window controller you’ll use to build sections & widgets. Also spawns a global Open/Close button.
local ui = Library:Setup({ Location = game.CoreGui, -- parent for the ScreenGui OpenCloseLocation = "Top Center" -- "Top Left" | "Top Center" | "Top Right" -- "Middle Left" | "Middle Right" -- "Bottom Left" | "Bottom Center" | "Bottom Right" })
Tip: Pass
OpenCloseLocation
explicitly — positions above are supported. -
CreateSection
Adds a pane in the left nav. Widgets created from this section appear in its right‑side body.
local versus = ui:CreateSection("Versus") local airlines = ui:CreateSection("Airlines")
-
createLabel
Static text — now supports a one‑switch “Discord‑style” special look (transparent, centered, bold, underlined, italic). You can also mix‑and‑match.
versus:createLabel({ Name = "hello world", Special = true, -- renders like __***hello world***__ }) -- granular control versus:createLabel({ Name = "Centered + rich", TransparentBackground = true, Center = true, Bold = true, Underline = true, Italic = true, }) -- or pass your own RichText versus:createLabel({ Name = "ignored when Markup set", Markup = "hello world", })
-
createButton
Clickable action. Use flags or your own state to guard execution.
versus:createButton({ Name = "Vague Button", Description = "Needs 'Normal Toggle' active to respond.", Callback = function() if Library.Flags["Jimbo"] then print("Hello!!") else warn("Error: 'Normal Toggle' is off.") end end, })
-
createToggle
Boolean switch that auto‑persists via
Library.Flags
. Triggered on initialise & every change.versus:createToggle({ Name = "Normal Toggle", Flag = false, flagName = "Jimbo", Callback = function(v) print("Toggle:", v) end, })
-
createSlider
Continuous numeric input (min..max). Drag or type — value persists to
Flags[flagName]
.versus:createSlider({ Name = "Speed", Description = "WalkSpeed (1‑100)", flagName = "Speed", minValue = 1, maxValue = 100, Callback = function(v) game.Players.LocalPlayer.Character.Humanoid.WalkSpeed = v end, })
-
createInputBox
Free‑text / number entry with automatic storage on Enter.
versus:createInputBox({ Name = "Jump Height", flagName = "Jump", Flag = 50, Callback = function(v) game.Players.LocalPlayer.Character.Humanoid.JumpHeight = tonumber(v) end, })
-
createDropdown
Single‑ or multi‑select list. Returns a helper with
updateList(newList)
to refresh on the fly.local dd = versus:createDropdown({ Name = "Crew", flagName = "CrewDrop", Flag = {"Samantha"}, List = {"Samantha","Emma","Daisy","Timmy"}, multi = true, Callback = print, }) -- later: dd:updateList({"Ava","Olivia","Mia"})
-
Info & Warning Icons (NEW)
Every widget supports a right‑side icon bar. Pass
Description
to get an info dialog; passWarning
(string or function) and optionalWarnIf
to show an amber warning that opens a styled message.versus:createToggle({ Name = "God Mode", flagName = "GodMode", Description = "Makes you invincible (client‑side).", Warning = function() return "Server anticheat may kick you." end, WarnIf = function() return true end, -- return false to show a disabled icon })
Warnings & info use the same message UI as createDisplayMessage below.
-
createDisplayMessage (NEW)
Show a modal message with animated stroke, background blur, and Backspace/Esc to close. Styles:
"info"
,"warning"
,"danger"
. You can add buttons with callbacks.Library:createDisplayMessage("Heads up", "Something changed behind the scenes.", { { text = "OK", color = Color3.fromRGB(82,171,255) }, { text = "More", color = Color3.fromRGB(120,120,120), callback=function() print("more") end }, }, "info" )
-
PromptBugReport (NEW)
Opens a full bug‑report form and POSTs JSON to the report server. Optional checkboxes include your per‑game saves and theme files.
Library:PromptBugReport() -- opens the modal
Backspace/Esc to closeIncludes key + summary + descriptionCan attach saves.json & theme JSONs -
Theme System (UpdateUI + Customizer)
Switch themes instantly or open a multi‑screen customizer with presets, colour grid, and the ability to save/overwrite your own themes.
ui:UpdateUI("Dark Mode") -- apply any preset: "Light Mode", "Dark Mode", "Halloween", etc. Library:OpenCustomizer() -- launch the interactive customizer -- Saved theme helpers: Library:SaveCurrentThemeAs("My Cool Theme") Library:OverwriteSavedTheme("My Cool Theme")
Note: Special labels keep their transparent background & hidden stroke when themes change.
Presets: Light/Dark + 20+ curated setsSaves toVersus Airlines 2.0/themes.json
Your themes inVersus Airlines 2.0/my_themes.json
-
Open/Close Button & Left Icon Bar
The window spawns a global toggle button and a small icon bar in the left column.
- Folder: Opens the Versus folder (copies path if open fails)
- Trash: Deletes the current game’s save (with confirm)
- Bug: Opens the bug reporter
- Customize: Opens the theme customizer
-- Visibility flag for your loops: if Library.isClosed then -- UI is currently visible end
The
isClosed
field is a boolean you can read; it reflects the current main window visibility. -
Flags & Persistence
All widget state lives in
Library.Flags
and autosaves per‑game to the filesystem when supported.print(Library.Flags) -- read everything print(Library.Flags["Jimbo"]) -- read one flag
Folder:Versus Airlines 2.0/
Save file:saves.json
(per‑placeId) -
TrackConnection & Cleanup
Tag event connections so you can safely tear them down when a toggle disables — or when the UI cleans up.
Library:CleanupConnectionsByTag("AutoFarm") Library:TrackConnection(RunService.RenderStepped:Connect(function() end), "AutoFarm")
-
UI Sounds
Light click/pop SFX. Disabled by default — flip the switch if you want audible feedback.
Library.DisableSounds = false Library:PlaySound("Click") -- also: "Pop"
-
Template — Toggle + RenderStepped Loop
Runs every frame while the toggle is on — automatically cleans up when off.
versus:createToggle({ Name = "Normal Toggle", Flag = false, flagName = "Jimbo", Callback = function(enabled) Library:CleanupConnectionsByTag("AutoJimbo") if enabled then local conn = RunService.RenderStepped:Connect(function() if not Library.Flags["Jimbo"] then return end print("'Normal Toggle' flag is enabled!") end) Library:TrackConnection(conn,"AutoJimbo") end end, })
-
Template — Throttled Heartbeat (2s)
Fires at a lower rate using
tick()
.versus:createToggle({ Name = "Jimbo With Waiting", Flag = false, flagName = "waitJimbo", Callback = function(enabled) Library:CleanupConnectionsByTag("AutowaitJimbo") if enabled then local last = 0 local conn = RunService.Heartbeat:Connect(function() if not Library.Flags["waitJimbo"] then return end if tick() - last >= 2 then print("Jimbo tick!") last = tick() end end) Library:TrackConnection(conn,"AutowaitJimbo") end end, })
-
Template — Dynamic Dropdown
Refreshes every time the player list changes — without reopening the UI.
local dd = versus:createDropdown({ Name = "Players", flagName = "PlayerDrop", List = {}, }) local function refresh() local names = {} for _,plr in ipairs(game.Players:GetPlayers()) do table.insert(names,plr.Name) end dd:updateList(names) end refresh() Library:TrackConnection(game.Players.PlayerAdded:Connect(refresh),"PlayersDD") Library:TrackConnection(game.Players.PlayerRemoving:Connect(refresh),"PlayersDD")