In short: on a single server the lobby is its own world — create it with Multiverse-Core and turn on join-destination so every login starts there. On a network the lobby is its own Paper server, first in the try list of velocity.toml. The rest is the same: a void world with a build at the spawn point, players spawning there on every join, damage, hunger, PvP and building switched off, and a mode picked through a menu, an NPC or a compass from a hub plugin.
Lobby world or lobby server
| A world on the same server | A separate server behind Velocity | |
|---|---|---|
| Fits when | There's one mode: survival, anarchy, creative | There are several modes, each on its own server |
| Built with | The Multiverse-Core plugin | One more Paper server and the Velocity proxy |
| Where a player lands on login | join-destination in Multiverse | The first server in try in velocity.toml |
| Going to a mode | A teleport to another world | /server <mode> or a menu button |
| Load | One shared main thread: lag in one world is felt in all | Its own process: the lobby doesn't slow the modes |
How a second world differs from a separate server is covered in Multiverse-Core, and how a proxy network fits together in Minecraft server networks and setting up Velocity.
A void world to build in
A lobby is built from scratch or pasted in with WorldEdit — //schem load and //paste, see WorldEdit — so you don't need terrain around it. On a separate lobby server you get a void world without plugins: a flat world of a single air layer with the the_void biome.
# server.properties of the lobby server — before the first start
level-type=minecraft\:flat
generator-settings={"biome":"minecraft:the_void","layers":[{"block":"minecraft:air","height":1}]}Generation settings only apply when the world is created: if the world already exists, stop the server and delete its folder or set a different level-name. On a shared server Multiverse-Core creates the lobby world and a generator plugin makes it empty — for example VoidGen from the generator list in the Multiverse docs.
Players always spawn in the lobby
# a lobby world on a shared server: Multiverse-Core + the VoidGen generator
/mv create lobby normal --generator VoidGen
/mv tp lobby
# build or paste a platform, stand on it:
/mv setspawn
/mv config enable-join-destination true
/mv config join-destination lobby- Lobby world. With
enable-join-destination: trueMultiverse puts the player in thejoin-destinationworld on every login instead of where they logged out. The option is off by default. - Lobby server. Velocity sends the player to the server in
tryon login and when they're kicked from another server. Inside the lobby, set the point with/setworldspawnand/setspawnfrom EssentialsX Spawn;spawn-on-join: truein the EssentialsX config.yml teleports everyone who joins to spawn — or only listed groups. - Getting back to the lobby. In one world —
/spawnfrom EssentialsX Spawn. On a network — Velocity's built-in/server lobby; the familiar/huband/lobbyaren't built into Velocity, plugins add them.
No damage, hunger, PvP or building
| What to turn off | With the game itself | WorldGuard or Multiverse |
|---|---|---|
| Hunger | difficulty=peaceful: on Peaceful the hunger bar never depletes and hostile mobs don't spawn | The natural-hunger-drain deny flag; in Multiverse — /mv modify lobby set hunger false |
| Damage | Game rules fall_damage, fire_damage, drowning_damage, freeze_damage → false | The invincible allow flag — the player can't be hurt at all |
| PvP | Game rule pvp false (since 1.21.9; before that pvp=false in server.properties) | The pvp deny flag; in Multiverse — set pvp false |
| Building | Adventure mode: gamemode=adventure and force-gamemode=true — without special items blocks can't be broken or placed | /mv modify lobby set gamemode adventure — Multiverse switches the mode on entering the world |
| Time and weather | Game rules advance_time false and advance_weather false | The time-lock and weather-lock flags — they change only what the player sees |
| Mobs | Game rule spawn_mobs false | The mob-spawning deny flag |
| Dropping and picking up items | — | The item-drop deny and item-pickup deny flags |
# in the lobby world: rules for the whole world via the __global__ region
/rg flag __global__ pvp deny
/rg flag __global__ invincible allow
/rg flag __global__ natural-hunger-drain deny
/rg flag __global__ mob-spawning deny
/rg flag __global__ item-drop deny
/rg flag __global__ passthrough deny # only region members can build
# the same from the console — with the world named
rg flag __global__ pvp -w lobby denyTest the lobby from a regular account without OP: operators bypass WorldGuard protection, which makes the flags look broken. Region priorities and the other flags are in WorldGuard.
Picking a mode: menu, NPC and compass
- Menu. A chest with a button per mode. In DeluxeMenus a button with the
[connect] survivalaction sends the player to that network server — on Velocity this needsbungee-plugin-message-channel; for a world on the same server the button runs a world-switch command. Details in menu plugins. - NPC. A character by the portal: a click opens a menu or runs a command. Plugins and first commands are in NPC plugins, a label above the NPC in hologram plugins.
- A compass in the inventory. An item the player gets on joining that opens the mode selector. Ready-made hub plugins provide it — and they also cover world rules and spawn.
| DeluxeHub | Hubbly | |
|---|---|---|
| Published on | SpigotMC | Modrinth, open source (AGPL-3.0) |
| Versions | The page lists versions up to 1.21 | 1.20.6–26.x, tagged up to 26.3 on Modrinth |
| Mode selector | Join items, a server selector menu with PlaceholderAPI support | A compass server selector, join items |
| World rules | Toggle block breaking and placing, fall damage, hunger, PvP, weather, item drop and pickup | Toggle building, damage, hunger, weather, item drop and pickup |
| Also | Scoreboard, tab list, announcements, launch pads, double jump, void-fall protection | Launch pads, boss bar, announcements, player hider, spawn on join, void-fall protection |
A lobby server on a network
A lobby server is set up like any server behind a proxy: online-mode=false, player info forwarding from Velocity and a port closed by the firewall — step by step in setting up Velocity. Keep it on the same version as the modes, and recheck [connect] menus whenever you rename servers in [servers].
The lobby and cheaters
The lobby is the first place a cheater switches the client on: Fly and Speed on the parkour, KillAura in the PvP zone. DGuard — the best anticheat for a modern Minecraft server — goes on the lobby server too, with its own key and the latest PacketEvents next to it, and checks combat, movement, packets, inventory, building and the world the same way on every server of the network. Hidden mode never tells a cheater he's been caught while DGuard collects evidence, and you set the strictness of punishments.
| Cheat | DGuard | GrimAC | Vulcan | Polar | Intave | Matrix |
|---|---|---|---|---|---|---|
| Flyflies without elytra or creative | ||||||
| Speedfaster than the game allows | ||||||
| Timerspeeds the game up | ||||||
| Blinkholds packets, then teleports | partly: no dedicated check — partly, via the experimental BadPacketsR | |||||
| KillAurahits targets by itself | partly: no dedicated check — only indirectly, via Reach and packet order | |||||
| Reachhits beyond reach |
If the lobby is a world on the same server, no extra install is needed: the anticheat sees players in every world of its server. A separate lobby server is one more server in the DGuard panel; protection is the same on every plan, and you pay for online players and the number of servers — see pricing.
FAQ
How do I make a lobby on a Minecraft server?
On one server, a separate world made with Multiverse-Core with join-destination turned on; on a network, a separate Paper server first in Velocity's try list. Then a void world with a build, spawn on every join, damage, hunger and PvP turned off, and a mode selector menu.
How do I make players always spawn in the lobby?
In Multiverse-Core run /mv config enable-join-destination true and /mv config join-destination lobby. On a separate lobby server set the point with /setspawn and turn on spawn-on-join: true in the EssentialsX config.yml.
How do I disable hunger and damage in the lobby?
On a separate server use difficulty=peaceful (hunger never depletes on Peaceful) and set the fall_damage, fire_damage, drowning_damage and freeze_damage game rules to false. In a lobby world on a shared server use the WorldGuard flags invincible allow and natural-hunger-drain deny.
How do I make a server selector compass?
The easiest way is a hub plugin such as DeluxeHub or Hubbly: it gives an item on join that opens a server menu. Check that the plugin supports your version before installing it.
Does a lobby server need an anticheat?
Yes: cheaters show up in the lobby first — flying over the parkour or running KillAura in the PvP zone. On a Velocity network the anticheat goes on every game server, the lobby included, not on the proxy.
Sources
- Multiverse-Core: config.yml (join-destination)
- Multiverse-Core: world properties (hunger, pvp, gamemode)
- Multiverse-Core: generator plugins (VoidGen)
- Minecraft Wiki: Superflat (The Void, generator-settings)
- Minecraft Wiki: server.properties (gamemode, force-gamemode, difficulty)
- Minecraft Wiki: Difficulty (hunger on Peaceful)
- Minecraft Wiki: game rules
- WorldGuard: region flags
- EssentialsX: config.yml (spawn-on-join)
- Velocity: configuration (try)
- Paper: world configuration (unsupported-settings.ticking)
- DeluxeHub on SpigotMC
- Hubbly on Modrinth
- DGuard, the best anticheat for a modern Minecraft server: checks compared with GrimAC, Vulcan, Polar, Intave and Matrix
- DGuard: installation, requirements and troubleshooting
- DGuard: supported Paper and Leaf versions