§ How to · with Picoo

How to make a lobby in Roblox Studio

By Sametcan Tasgiran, Founder & Developer·Published ·Updated

Ask Picoo to make a lobby and it builds a hub world: a fountain plaza where players spawn, paths out to named zones, a plot for every player and pads that move them around.

It applies game_map, Picoo's map kit, whose default theme is this lobby hub: 10 scripts and 3,209 lines in one recipe call. A ready-up queue that teleports a group into a match is a separate system you add with a follow-up prompt.

A hub you can edit

One kit under Workspace.MapKit, all of it real parts in Edit mode: ground, fountain plaza, spawn, paths, zones, plots and edge walls, and the buildings, trees, rocks, props and lamps as textured CC0 models.

A plot for every player

Six plots by default (2 to 12). Each player who joins gets the first free one: their name goes on its sign and its border lights up in their colour. When they leave, it goes to a player who is waiting. Game code reads plot:GetAttribute("OwnerId") or player:GetAttribute("PlotId").

Portal pads

Walk onto a glowing pad and the server moves you to its zone, facing the right way; a pad there brings you back. A My Plot pad at the hub sends you to your own plot, and a light beam guides each player to it.

Coins and discovery

30 coins along the paths and in the zones, each worth 1 in leaderstats Coins and back after 20 seconds. Walking into a zone for the first time shows Discovered: <zone>; finding them all plays an Explorer celebration worth 10 coins.

Fountain show and daily chest

Hold E at the fountain for a water-jet and fireworks show. The daily chest pays 25 coins once a day per player, remembered across rejoins and, once the game is published, across servers through a DataStore.

Nobody falls off

Walls at the edge, and anything with a Humanoid that drops below the map is put back on the spawn. Press Play in Studio and a self-test checks spawn, paths, walls, rescue, lighting, portals and prompts, then prints one MAP_SELFTEST line.

Files Picoo ships for this prompt

12 files · 3209 lines · one recipe call

ServerScriptService/MapKit/Main.lua

Script that starts the map at Play: for that session it switches off any place SpawnLocation inside the map and sets aside the place's own sky and effects, then starts rescue, plots, interactions and the builder.

126 lines

ServerScriptService/MapKit/Config.lua

Generated settings and layout: theme, size, mood, spawn, zones, plots, portal pads, coin positions and sounds.

229 lines

ServerScriptService/MapKit/MapBuilder.lua

At Play, keeps the CC0 models Edit mode already shows, builds any decor Edit mode did not get, adds the decor's colliders and lamp lights, and shows a simple shape wherever a model does not load.

662 lines

ServerScriptService/MapKit/DecorData.lua

The decor rows (trees, rocks, props, lamps) as one compact string, and the Edit-mode folder each row was built in.

12 lines

ServerScriptService/MapKit/Interact.lua

Server rules for zone discovery, coins, portal pads, the fountain show and the daily chest.

1025 lines

ServerScriptService/MapKit/PlotService.lua

Gives each player a plot, puts their name on the sign, colours the border and frees the plot when they leave.

200 lines

ServerScriptService/MapKit/Rescue.lua

Puts anything with a Humanoid that falls below the map back on the spawn.

76 lines

ServerScriptService/MapKit/SelfTest.lua

Studio-only check on Play that prints one MAP_SELFTEST line.

366 lines

ServerScriptService/MapKit/PicooKit.lua

Marker Picoo reads to recognise the kit, so it can change the map's settings later.

6 lines

StarterPlayer/StarterPlayerScripts/MapKitClient.lua

Draws what the server reports: zone counter, Discovered toasts, coin pops, portal flashes and the beam to your plot.

507 lines

Workspace/MapKit

The map as real parts in Edit mode: ground, plaza, fountain, paths, zones, plots, walls and backdrop.

instance

Lighting/MapKitSky, MapKitAtmosphere, MapKitBloom, MapKitSunRays, MapKitColorCorrection

The map's sky and post effects, plus clouds under Workspace/Terrain.

instance

Sample output: ServerScriptService/MapKit/PlotService.lua

--!strict
-- Player plots: every player who joins gets the first free plot (the sign shows
-- "<name>'s Plot", the claim pad lights up, the plot's border glows in the player's
-- colour). A player without a plot (all taken) gets the next one that frees up, or
-- claims a free one by touching its pad. Interact.luau hooks onClaim to send the
-- player a guide (a light beam to the plot). Game code reads the owner from
-- plot:GetAttribute("OwnerId") or player:GetAttribute("PlotId"), and spawns things at
-- the plot's SpawnPoint.

-- (excerpt) plot lookups, sign, border and pad helpers sit here; then:

local function claim(player: Player, id: string): boolean
	if owners[id] or PlotService.plotOf(player) then
		return false
	end
	local plot = plotModel(id)
	if not plot then
		return false
	end
	owners[id] = player.UserId
	plot:SetAttribute("OwnerId", player.UserId)
	player:SetAttribute("PlotId", id)
	player:SetAttribute("WaitingForPlot", nil)
	setSign(plot, player.DisplayName .. "'s Plot")
	setPad(plot, true)
	local color = colorOf(id)
	setBorder(plot, color)
	player:SetAttribute("PlotColor", color)
	for _, fn in claimHooks do
		task.spawn(fn, player, plot, color)
	end
	return true
end

function PlotService.assign(player: Player): Instance?
	for _, p in Config.Plots do
		if not owners[p.Id] and claim(player, p.Id) then
			return plotModel(p.Id)
		end
	end
	player:SetAttribute("WaitingForPlot", true)
	return nil
end

function PlotService.release(player: Player)
	for id, userId in owners do
		if userId == player.UserId then
			owners[id] = nil
			local plot = plotModel(id)
			if plot then
				plot:SetAttribute("OwnerId", nil)
				setSign(plot, labelOf(id))
				setPad(plot, false)
				setBorder(plot, nil)
			end

Building a lobby in Roblox Studio

A lobby is where a player decides whether your game is worth staying in, so it has to answer three questions fast: where am I, what is mine, and where do I go next.

Ask Picoo to make a lobby and it applies game_map, its map kit, with the default lobby hub theme. The spawn faces a fountain plaza at the centre, paths lead out to named zones, and plots sit in a ring around the hub. Everything, decor included, is real parts under Workspace.MapKit in Edit mode, so you can move a building or recolour a path before pressing Play. The buildings and decor are textured CC0 models in Edit mode already, and anything whose model does not load on Play shows a simple shape instead of leaving a hole.

Ownership is handled on the server. PlotService gives each joining player the first free plot, writes their name on its sign, lights the border in their colour and records OwnerId on the plot and PlotId on the player, which is what your own game code reads. When a player leaves, the plot goes to whoever is waiting. Movement works the same way: the server checks each player's position against the portal pads, moves them with PivotTo when they step on one, and the client only draws the flash and the beam.

The rest is what a new player does first: coins to walk through along the paths, a Discovered toast in each new zone, a fountain show on a ProximityPrompt and a daily chest saved per player once the game is published. Nobody can fall off either: walls at the edge, and a rescue that puts anyone below the map back on the spawn.

The match is the part you add. A queue that counts ready players, runs a countdown and teleports the group into a separate place is a follow-up prompt, and it should keep the roster on the server and send the whole group in one TeleportAsync call.

See more on the Luau generator, the AI Luau script writer, the 3D model generator and the game builder, read how Picoo compares with ChatGPT, or browse the full blog.

Frequently asked

What does Picoo build when I ask for a lobby?+

The game_map recipe with its default theme, the lobby hub: a plaza with a fountain and the spawn facing it, paths out to two zones (named Shop and Event Plaza until you rename them), six player plots, portal pads, 30 coins, a fountain show and a daily chest. That is 10 scripts under ServerScriptService.MapKit and StarterPlayerScripts, plus the map itself as parts under Workspace.MapKit.

Can I change how it looks?+

Yes, by asking again with new settings: size (small, medium or large), mood (day, sunset or night), style (neon, winter, desert, autumn, spooky or candy), plot count (2 to 12), the title and the zone names. Picoo re-applies the kit with the complete new settings and rebuilds its own parts in place; editing Config by hand changes numbers, not the map.

Will it build over my existing game?+

The kit builds into an empty place. If your place already has your own world in it, Picoo builds what you asked for into that world by hand instead, and offers the full lobby in a new place: save and close your game, open File > New > Baseplate, connect Picoo there and ask again.

How do I send players from the lobby into a match?+

Ask for it in a follow-up prompt. A queue that gathers ready players and teleports them together needs a roster kept on the server, a countdown that cancels when players drop below the minimum, and one TeleportService:TeleportAsync call with the whole group, wrapped in pcall. Teleporting players one at a time sends each to a separately chosen server, and the older TeleportPartyAsync is deprecated.

Why does my lobby look flatter than expected?+

Two settings the kit leaves to you. Lighting.Technology can only be changed in Studio's Properties window, so select Lighting and set it to Future. And if Lighting still holds the place's own Sky, Atmosphere, Bloom or SunRays, Edit mode may show those instead of the map's; Play always uses the map's, and deleting the place's own ones makes Edit mode match.

Related Picoo prompts